webentwicklung-frage-antwort-db.com.de

Python-Pandas fügen Liste in eine Zelle ein

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!


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 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.

57
ragesz

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.

34
ragesz

2017 Update

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 atalways 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
64
Michael Hays

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.

2
Ando Jurai

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.


Zellenwerte mit 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]

Was ist, wenn ich 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 objects 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]

Möglich, aber Hacky

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]
2
coldspeed

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]
0
Pallavi Jindal