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, daher möchte ich folgendes Ergebnis:
A B
0 12 NaN
1 23 ['foo', 'bar']
Ho kann ich das machen?
1) Wenn ich das benutze:
df.ix[1,'B'] = abc
Ich erhalte folgende Fehlermeldung:
ValueError: Must have equal len keys and value when setting with an iterable
weil versucht wird, die Liste (die zwei Elemente enthält) in eine Zeile/Spalte einzufügen, jedoch nicht in eine Zelle.
2) Wenn ich das benutze:
df.ix[1,'B'] = [abc]
dann fügt es eine Liste ein, 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!
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 df3.loc[1,'B']
einfügen.
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
.
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 Fall kann df['B'] = df['B'].astype(object)
helfen.
Da set_value
seit Version 0.21.0 veraltet ist, sollten Sie jetzt at
verwenden. Es kann eine Liste in eine Zelle einfügen, ohne dass eine ValueError
wie loc
erstellt wird. Ich denke, das liegt daran, dass at
always sich auf einen einzelnen Wert bezieht, während loc
sich sowohl auf Werte als auch auf Zeilen und Spalten beziehen kann.
df = pd.DataFrame(data={'A': [1, 2, 3], 'B': ['x', 'y', 'z']})
df.at[1, 'B'] = ['m', 'n']
df =
A B
0 1 x
1 2 [m, n]
2 3 z
Wie in diesem Beitrag erwähnt pandas: Wie speichert man eine Liste in einem Datenrahmen? ; get dtypes im Dataframe kann die Ergebnisse beeinflussen sowie das Aufrufen eines Dataframes oder das Nichtzuweisen von Daten.
v0.23 +, set_value
ist veraltet.
Sie können jetzt DataFrame.at
verwenden, um die Beschriftung festzulegen, und DataFrame.iat
, um die Integer-Position festzulegen.
at
/ iat
einstellen# Setup
df = pd.DataFrame({'A': [12, 23], 'B': [['a', 'b'], ['c', 'd']]})
df
A B
0 12 [a, b]
1 23 [c, d]
df.dtypes
A int64
B object
dtype: object
Wenn Sie einen Wert in der zweiten Zeile von "B" auf eine neue Liste setzen möchten, verwenden Sie DataFrane.at
:
df.at[1, 'B'] = ['m', 'n']
df
A B
0 12 [a, b]
1 23 [m, n]
Sie können auch die Ganzzahl mit DataFrame.iat
setzen.
df.iat[1, df.columns.get_loc('B')] = ['m', 'n']
df
A B
0 12 [a, b]
1 23 [m, n]
ValueError: setting an array element with a sequence
bekomme?Ich werde versuchen, dies mit zu reproduzieren:
df
A B
0 12 NaN
1 23 NaN
df.dtypes
A int64
B float64
dtype: object
df.at[1, 'B'] = ['m', 'n']
# ValueError: setting an array element with a sequence.
Dies liegt daran, dass Ihr Objekt den Typ float64
dtype hat, während die Listen object
s sind. Es gibt also einen Konflikt. In dieser Situation müssten Sie zuerst die Spalte in ein Objekt konvertieren.
df['B'] = df['B'].astype(object)
df.dtypes
A int64
B object
dtype: object
Dann funktioniert es:
df.at[1, 'B'] = ['m', 'n']
df
A B
0 12 NaN
1 23 [m, n]
Noch verrückter, ich habe festgestellt, dass Sie durch DataFrame.loc
hacken können, um etwas Ähnliches zu erreichen, wenn Sie verschachtelte Listen übergeben.
df.loc[1, 'B'] = [['m'], ['n'], ['o'], ['p']]
df
A B
0 12 [a, b]
1 23 [m, n, o, p]
Schnelle Arbeit um
Fügen Sie die Liste einfach in eine neue Liste ein, wie für col2 im folgenden Datenrahmen. Der Grund dafür ist, dass Python die äußere Liste (von Listen) nimmt und sie in eine Spalte konvertiert, als ob sie normale skalare Elemente enthält, was in unserem Fall Listen und keine normalen Skalare sind.
mydict={'col1':[1,2,3],'col2':[[1, 4], [2, 5], [3, 6]]}
data=pd.DataFrame(mydict)
data
col1 col2
0 1 [1, 4]
1 2 [2, 5]
2 3 [3, 6]