Mam listę „abc” i ramkę danych „df”:
abc = ['foo', 'bar']
df =
A B
0 12 NaN
1 23 NaN
Chcę wstawić listę do komórki 1B, więc chcę ten wynik:
A B
0 12 NaN
1 23 ['foo', 'bar']
Jak mogę to zrobić?
1) Jeśli używam tego:
df.ix[1,'B'] = abc
Otrzymuję następujący komunikat o błędzie:
ValueError: Must have equal len keys and value when setting with an iterable
ponieważ próbuje wstawić listę (która ma dwa elementy) do wiersza / kolumny, ale nie do komórki.
2) Jeśli używam tego:
df.ix[1,'B'] = [abc]
następnie wstawia listę zawierającą tylko jeden element, którym jest lista „abc” ( [['foo', 'bar']]
).
3) Jeśli używam tego:
df.ix[1,'B'] = ', '.join(abc)
następnie wstawia ciąg: ( foo, bar
), ale nie listę.
4) Jeśli używam tego:
df.ix[1,'B'] = [', '.join(abc)]
następnie wstawia listę, ale ma tylko jeden element ( ['foo, bar']
), ale nie dwa, jak chcę ( ['foo', 'bar']
).
Dzięki za pomoc!
EDYTOWAĆ
Moja nowa ramka danych i stara lista:
abc = ['foo', 'bar']
df2 =
A B C
0 12 NaN 'bla'
1 23 NaN 'bla bla'
Inna ramka danych:
df3 =
A B C D
0 12 NaN 'bla' ['item1', 'item2']
1 23 NaN 'bla bla' [11, 12, 13]
Chcę wstawić listę „abc” do df2.loc[1,'B']
i / lub df3.loc[1,'B']
.
Jeśli ramka danych zawiera kolumny tylko z wartościami całkowitymi i / lub wartościami NaN i / lub wartościami listy, to wstawienie listy do komórki działa idealnie. Jeśli ramka danych ma kolumny tylko z wartościami ciągów i / lub wartościami NaN i / lub wartościami listy, wstawienie listy do komórki działa idealnie. Ale jeśli ramka danych ma kolumny z wartościami całkowitymi i ciągami oraz inne kolumny, pojawi się komunikat o błędzie, jeśli użyję tego: df2.loc[1,'B'] = abc
lub df3.loc[1,'B'] = abc
.
Inna ramka danych:
df4 =
A B
0 'bla' NaN
1 'bla bla' NaN
Te wkładki działają idealnie: df.loc[1,'B'] = abc
lub df4.loc[1,'B'] = abc
.
0.15.0
:df.loc[1,'b'] = ['foo','bar']
Odpowiedzi:
Ponieważ
set_value
jest przestarzały od wersji 0.21.0, powinieneś teraz używaćat
. Może wstawić listę do komórki bez podnoszenia aValueError
takloc
jak. Myślę, że dzieje się tak, ponieważat
zawsze odnosi się do pojedynczej wartości, podczas gdyloc
może odnosić się zarówno do wartości, jak i wierszy i kolumn.Musisz również upewnić się, że kolumna, do której wstawiasz, ma
dtype=object
. Na przykładźródło
df = pd.DataFrame(data, dtype=object)
ValueError: setting an array element with a sequence.
; zobacz odpowiedź @ cs95, jeśli pojawi się błąd.df3.set_value(1, 'B', abc)
działa dla dowolnej ramki danych. Zwróć uwagę na typ danych w kolumnie „B”. Na przykład. listy nie można wstawić do kolumny typu float, w takim przypadkudf['B'] = df['B'].astype(object)
może pomóc.źródło
Pandy> = 0,21
set_value
został wycofany. Możesz teraz używaćDataFrame.at
do ustawiania według etykiety iDataFrame.iat
do ustawiania według pozycji całkowitej.Ustawianie wartości komórek za pomocą
at
/iat
Jeśli chcesz ustawić wartość w drugim wierszu „B” na jakąś nową listę, użyj
DataFrane.at
:Możesz również ustawić według pozycji całkowitej za pomocą
DataFrame.iat
A co jeśli dostanę
ValueError: setting an array element with a sequence
?Spróbuję to odtworzyć za pomocą:
Dzieje się tak, ponieważ twój obiekt jest typu
float64
dtype, podczas gdy listy toobject
s, więc występuje tam niedopasowanie. W takiej sytuacji musisz najpierw przekonwertować kolumnę na obiekt.Wtedy działa:
Możliwe, ale Hacky
Co więcej, odkryłem, że możesz się włamać,
DataFrame.loc
aby osiągnąć coś podobnego, jeśli przepuszczasz zagnieżdżone listy.Możesz przeczytać więcej o tym, dlaczego to działa tutaj.
źródło
Jak wspomniano w tym poście pandy: jak przechowywać listę w ramce danych? ; typy dtypów w ramce danych mogą wpływać na wyniki, a także wywoływać ramkę danych lub jej nie przypisywać.
źródło
Szybka obejście
Po prostu umieść listę w nowej liście, tak jak to zrobiono dla col2 w ramce danych poniżej. Powodem tego jest to, że Python pobiera zewnętrzną listę (list) i konwertuje ją na kolumnę, tak jakby zawierała normalne elementy skalarne, którymi w naszym przypadku są listy, a nie zwykłe skalary.
źródło
Również dostaję
ValueError: Must have equal len keys and value when setting with an iterable
,użycie .at zamiast .loc nie zrobiło żadnej różnicy w moim przypadku, ale wymuszenie typu danych kolumny dataframe załatwiło sprawę:
Następnie mógłbym ustawić listy, tablicę numpy i inne rzeczy jako wartości pojedynczych komórek w moich ramkach danych.
źródło