Pridanie nového stĺpca do existujúceho DataFrame v programe Python pandas

Mám nasledujúci indexovaný DataFrame s pomenovanými stĺpcami a riadkami, ktoré nie sú súvislými číslami:

          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

Chcel by som pridať nový stĺpec, 'e', do existujúceho DataFrame a nechcem nič meniť v DataFrame (t.j. nový stĺpec má vždy rovnakú dĺžku ako DataFrame).

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

Skúšal som rôzne verzie join, append, merge, ale nedostal som požadovaný výsledok, nanajvýš chyby. Ako môžem pridať stĺpec e do uvedeného príkladu?

Riešenie

Na vytvorenie série použite pôvodné indexy df1:

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

Úprava 2015 Niektorí hlásili, že pri tomto kóde dostanú upozornenie SettingWithCopyWarning.
Kód však stále funguje perfektne s aktuálnou verziou pandas 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'

Výstraha SettingWithCopyWarning má za cieľ informovať o možnom neplatnom priradení na kópiu Dataframe. Nemusí nevyhnutne povedať, že ste to urobili zle (môže vyvolať falošne pozitívne výsledky), ale od verzie 0.13.0 vám dáva vedieť, že na rovnaký účel existujú vhodnejšie metódy. Ak potom dostanete varovanie, jednoducho sa riaďte jeho radami: namiesto toho skúste použiť .loc[row_index,col_indexer] = value

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

V skutočnosti je to v súčasnosti efektívnejšia metóda, ako je popísané v dokumentoch pandas.


Úprava 2017

Ako je uvedené v komentároch a od @Alexander, v súčasnosti najlepšou metódou na pridanie hodnôt série ako nového stĺpca DataFrame by mohlo byť použitie assign:

df1 = df1.assign(e=pd.Series(np.random.randn(sLength)).values)
Komentáre (27)

Toto je jednoduchý spôsob pridania nového stĺpca: df['e'] = e

Komentáre (4)

Najefektívnejšie bude, ak to urobíte priamo cez NumPy:

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

Všimnite si, že môj pôvodný (veľmi starý) návrh bol použiť map (čo je oveľa pomalšie):

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