1282 Stimmen

Wie füge ich eine neue Spalte zu einem vorhandenen DataFrame hinzu?

Ich habe das folgende indizierte DataFrame mit benannten Spalten und Zeilen, die nicht kontinuierliche Zahlen sind:

          a         b         c         d
2  0.671399  0.101208 -0.181532  0.241273
3  0.446172 -0.243316  0.051767  1.577318
5  0.614758  0.075793 -0.451460 -0.012493

Ich möchte eine neue Spalte, 'e', zum vorhandenen DataFrame hinzufügen und nichts im DataFrame ändern (d. h. die neue Spalte hat immer die gleiche Länge wie das DataFrame).

0   -0.335485
1   -1.166658
2   -0.385571
dtype: float64

Wie kann ich die Spalte e dem obigen Beispiel hinzufügen?

59voto

Andy Hayden Punkte 324102

Das direkte Ausführen mit NumPy ist am effizientesten:

df1['e'] = np.random.randn(sLength)

Mein ursprünglicher (sehr alter) Vorschlag war es, map zu verwenden (was viel langsamer ist):

df1['e'] = df1['a'].map(lambda x: np.random.random())

41voto

Abhishek Punkte 568

Einfachste Wege:-

data['new_col'] = list_of_values

data.loc[ : , 'new_col'] = list_of_values

Auf diese Weise vermeiden Sie das sogenannte verschachtelte Indizieren beim Festlegen neuer Werte in einem Pandas-Objekt. Klicken Sie hier, um mehr zu lesen.

27voto

digdug Punkte 449

Wenn Sie die gesamte neue Spalte auf einen Ausgangsbasiswert setzen möchten (z. B. None), können Sie dies tun: df1['e'] = None

Dies würde tatsächlich den Zellentyp "Objekt" zuweisen. Später können Sie also komplexe Datentypen wie Listen in einzelne Zellen einfügen.

25voto

hum3 Punkte 1323

Ich habe die gefürchtete SettingWithCopyWarning erhalten, und sie wurde nicht durch Verwendung der iloc-Syntax behoben. Mein DataFrame wurde durch read_sql aus einer ODBC-Quelle erstellt. Unter Verwendung eines Vorschlags von lowtech oben hat das Folgende für mich funktioniert:

df.insert(len(df.columns), 'e', pd.Series(np.random.randn(sLength),  index=df.index))

Dies funktionierte gut, um die Spalte am Ende einzufügen. Ich weiß nicht, ob es die effizienteste Lösung ist, aber ich mag keine Warnmeldungen. Ich denke, es gibt eine bessere Lösung, aber ich kann sie nicht finden und ich denke, es hängt von einem Aspekt des Index ab.
Hinweis: Dies funktioniert nur einmal und gibt eine Fehlermeldung aus, wenn versucht wird, eine vorhandene Spalte zu überschreiben.
Hinweis: Wie oben und ab 0.16.0 ist "assign" die beste Lösung. Siehe Dokumentation http://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.assign.html#pandas.DataFrame.assign Funktioniert gut für Datenflusstypen, bei denen Sie Ihre Zwischenwerte nicht überschreiben.

18voto

Sumit Pokhrel Punkte 1667
  1. Erstelle zunächst eine Python-Liste list_of_e, die relevante Daten enthält.
  2. Verwende dies: df['e'] = list_of_e

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X