Ich habe eine Liste 'abc' und einen Datenrahmen 'df':
abc = ['foo', 'bar']
df =
A B
0 12 NaN
1 23 NaN
Ich möchte die Liste in Zelle 1B einfügen, also möchte ich dieses Ergebnis:
A B
0 12 NaN
1 23 ['foo', 'bar']
Wie kann ich das machen?
1) Wenn ich das benutze:
df.ix[1,'B'] = abc
Ich erhalte die folgende Fehlermeldung:
ValueError: Must have equal len keys and value when setting with an iterable
weil es versucht, die Liste (die zwei Elemente enthält) in eine Zeile / Spalte, aber nicht in eine Zelle einzufügen.
2) Wenn ich das benutze:
df.ix[1,'B'] = [abc]
dann wird eine Liste eingefügt, die nur ein Element enthält, nämlich die 'abc'-Liste ( [['foo', 'bar']]
).
3) Wenn ich das benutze:
df.ix[1,'B'] = ', '.join(abc)
dann fügt es eine Zeichenfolge ein: ( foo, bar
), aber keine Liste.
4) Wenn ich das benutze:
df.ix[1,'B'] = [', '.join(abc)]
dann fügt es eine Liste ein, aber es hat nur ein Element ( ['foo, bar']
), aber nicht zwei, wie ich will ( ['foo', 'bar']
).
Danke für die Hilfe!
BEARBEITEN
Mein neuer Datenrahmen und die alte Liste:
abc = ['foo', 'bar']
df2 =
A B C
0 12 NaN 'bla'
1 23 NaN 'bla bla'
Ein weiterer Datenrahmen:
df3 =
A B C D
0 12 NaN 'bla' ['item1', 'item2']
1 23 NaN 'bla bla' [11, 12, 13]
Ich möchte die 'abc'-Liste in df2.loc[1,'B']
und / oder einfügen df3.loc[1,'B']
.
Wenn der Datenrahmen nur Spalten mit ganzzahligen Werten und / oder NaN-Werten und / oder Listenwerten enthält, funktioniert das Einfügen einer Liste in eine Zelle einwandfrei. Wenn der Datenrahmen nur Spalten mit Zeichenfolgenwerten und / oder NaN-Werten und / oder Listenwerten enthält, funktioniert das Einfügen einer Liste in eine Zelle einwandfrei. Wenn der Datenrahmen jedoch Spalten mit Ganzzahl- und Zeichenfolgenwerten sowie andere Spalten enthält, wird die Fehlermeldung angezeigt, wenn ich Folgendes verwende:df2.loc[1,'B'] = abc
oder df3.loc[1,'B'] = abc
.
Ein weiterer Datenrahmen:
df4 =
A B
0 'bla' NaN
1 'bla bla' NaN
Diese Einsätze funktionieren perfekt: df.loc[1,'B'] = abc
oder df4.loc[1,'B'] = abc
.
0.15.0
:df.loc[1,'b'] = ['foo','bar']
Antworten:
Da
set_value
ist veraltet seit Version 0.21.0, sollten Sie jetzt verwendenat
. Es kann eine Liste in eine Zelle einfügen, ohne einValueError
as zu erhöhenloc
. Ich denke, das liegt daran, dass es sichat
immer auf einen einzelnen Wert bezieht, währendloc
es sich sowohl auf Werte als auch auf Zeilen und Spalten beziehen kann.Sie müssen auch sicherstellen, dass die Spalte, in die Sie einfügen, vorhanden ist
dtype=object
. Beispielsweisequelle
df = pd.DataFrame(data, dtype=object)
ValueError: setting an array element with a sequence.
. Sehen Sie eine Antwort von @ cs95, wenn Sie den Fehler erhalten.df3.set_value(1, 'B', abc)
funktioniert für jeden Datenrahmen. Achten Sie auf den Datentyp der Spalte 'B'. Z.B. Eine Liste kann nicht in eine Float-Spalte eingefügt werden. In diesem Falldf['B'] = df['B'].astype(object)
kann dies hilfreich sein.quelle
Pandas> = 0,21
set_value
wurde veraltet. Sie können jetzt verwendenDataFrame.at
, um nach Beschriftung undDataFrame.iat
nach ganzzahliger Position festzulegen.Einstellen der Zellenwerte mit
at
/iat
Wenn Sie einen Wert in der zweiten Zeile des "B" für eine neue Liste festlegen möchten, verwenden Sie
DataFrane.at
:Sie können auch die Ganzzahlposition mit festlegen
DataFrame.iat
Was ist, wenn ich bekomme
ValueError: setting an array element with a sequence
?Ich werde versuchen, dies zu reproduzieren mit:
Dies liegt daran, dass Ihr Objekt vom
float64
Typ dtype ist, während Listenobject
s sind, sodass dort eine Nichtübereinstimmung vorliegt . In dieser Situation müssten Sie zuerst die Spalte in ein Objekt konvertieren.Dann funktioniert es:
Möglich, aber Hacky
Noch verrückter, ich habe festgestellt, dass Sie sich durchhacken können
DataFrame.loc
, um etwas Ähnliches zu erreichen, wenn Sie verschachtelte Listen übergeben.Lesen Sie hier mehr darüber, warum dies funktioniert .
quelle
Wie in diesem Beitrag erwähnt Pandas: Wie speichere ich eine Liste in einem Datenrahmen? ;; Die d-Typen im Datenrahmen können die Ergebnisse beeinflussen sowie einen Datenrahmen aufrufen oder nicht zuweisen.
quelle
Schnelle Abhilfe
Fügen Sie die Liste einfach in eine neue Liste ein, wie für col2 im Datenrahmen unten. Der Grund dafür ist, dass Python die äußere Liste (von Listen) nimmt und sie in eine Spalte konvertiert, als ob sie normale Skalarelemente enthalten würde, in unserem Fall Listen und keine normalen Skalare.
quelle
Auch bekommen
ValueError: Must have equal len keys and value when setting with an iterable
,Die Verwendung von .at anstelle von .loc hat in meinem Fall keinen Unterschied gemacht, aber das Erzwingen des Datentyps der Datenrahmenspalte hat den Trick getan:
Dann könnte ich Listen, Numpy-Arrays und alles Mögliche als Einzelzellenwerte in meinen Datenrahmen festlegen.
quelle