Hinzufügen einer neuen Spalte zu einem bestehenden DataFrame in Python pandas

Ich habe den folgenden indizierten DataFrame mit benannten Spalten und Zeilen nicht-kontinuierlichen Zahlen:

          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 bestehenden Datenrahmen hinzufügen und nichts am Datenrahmen ändern (d.h. die neue Spalte hat immer die gleiche Länge wie der Datenrahmen).

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

Ich habe verschiedene Versionen von join, append, merge ausprobiert, aber ich habe nicht das gewünschte Ergebnis erhalten, sondern höchstens Fehler. Wie kann ich die Spalte "e" zum obigen Beispiel hinzufügen?

Lösung

Verwenden Sie die ursprünglichen df1-Indizes, um die Reihen zu erstellen:

df1['e'] = pd.Series(np.random.randn(sLength), index=df1.index)

Edit 2015 Einige berichteten, dass sie mit diesem Code die Warnung "SettingWithCopyWarning" erhielten.
Allerdings läuft der Code immer noch perfekt mit der aktuellen Pandas-Version 0.16.1.

>>> sLength = len(df1['a'])
>>> df1
          a         b         c         d
6 -0.269221 -0.026476  0.997517  1.294385
8  0.917438  0.847941  0.034235 -0.448948

>>> df1['e'] = pd.Series(np.random.randn(sLength), index=df1.index)
>>> df1
          a         b         c         d         e
6 -0.269221 -0.026476  0.997517  1.294385  1.757167
8  0.917438  0.847941  0.034235 -0.448948  2.228131

>>> p.version.short_version
'0.16.1'

Die SettingWithCopyWarning soll über eine möglicherweise ungültige Zuweisung auf einer Kopie des Dataframe informieren. Sie sagt nicht notwendigerweise, dass man es falsch gemacht hat (sie kann falsch-positive Ergebnisse auslösen), aber seit 0.13.0 lässt sie einen wissen, dass es geeignetere Methoden für den gleichen Zweck gibt. Wenn Sie dann die Warnung erhalten, befolgen Sie einfach den Rat: Versuchen Sie stattdessen .loc[row_index,col_indexer] = value zu verwenden.

>>> df1.loc[:,'f'] = pd.Series(np.random.randn(sLength), index=df1.index)
>>> df1
          a         b         c         d         e         f
6 -0.269221 -0.026476  0.997517  1.294385  1.757167 -0.050927
8  0.917438  0.847941  0.034235 -0.448948  2.228131  0.006109
>>> 

In der Tat ist dies derzeit die effizientere Methode, wie in der Pandas-Dokumentation beschrieben


Edit 2017

Wie in den Kommentaren und von @Alexander angedeutet, könnte die beste Methode zum Hinzufügen der Werte einer Reihe als neue Spalte eines DataFrame derzeit die Verwendung von assign sein:

df1 = df1.assign(e=pd.Series(np.random.randn(sLength)).values)
Kommentare (27)

Dies ist die einfache Art, eine neue Spalte hinzuzufügen: df['e'] = e

Kommentare (4)

Am effizientesten ist es, dies direkt über NumPy zu tun:

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

Beachten Sie, dass mein ursprünglicher (sehr alter) Vorschlag war, map zu verwenden (was viel langsamer ist):

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