Nieuwe kolom toevoegen aan bestaand DataFrame in Python pandas

Ik heb het volgende geïndexeerde DataFrame met benoemde kolommen en rijen met niet-doorlopende getallen:

          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

Ik wil een nieuwe kolom, 'e', toevoegen aan het bestaande dataframe en wil niets veranderen in het dataframe (d.w.z. dat de nieuwe kolom altijd dezelfde lengte heeft als het DataFrame).

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

Ik heb verschillende versies van join, append, merge geprobeerd, maar ik kreeg niet het resultaat dat ik wilde, hooguit fouten. Hoe kan ik kolom e toevoegen aan het bovenstaande voorbeeld?

Oplossing

Gebruik de originele df1 indexen om de series te maken:

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

Edit 2015 Sommigen meldden dat ze de SettingWithCopyWarning kregen met deze code.
De code loopt echter nog steeds perfect met de huidige pandas versie 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'

De SettingWithCopyWarning is bedoeld om te informeren over een mogelijk ongeldige toewijzing op een kopie van het Dataframe. Het zegt niet noodzakelijk dat je het verkeerd deed (het kan valse positieven veroorzaken) maar vanaf 0.13.0 laat het je weten dat er meer adequate methoden zijn voor hetzelfde doel. Dan, als je de waarschuwing krijgt, volg gewoon het advies op: Probeer in plaats daarvan .loc[row_index,col_indexer] = value te gebruiken

>>> 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 feite is dit momenteel de efficiëntere methode zoals beschreven in pandas docs


Edit 2017

Zoals aangegeven in de commentaren en door @Alexander, zou momenteel de beste methode om de waarden van een Reeks als een nieuwe kolom van een DataFrame toe te voegen het gebruik van assign kunnen zijn:

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

Dit is de eenvoudige manier om een nieuwe kolom toe te voegen: df['e'] = e

Commentaren (4)

Dit rechtstreeks doen via NumPy zal het meest efficiënt zijn:

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

Merk op dat mijn oorspronkelijke (zeer oude) suggestie was om map te gebruiken (wat veel langzamer is):

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