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?
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)
Dit is de eenvoudige manier om een nieuwe kolom toe te voegen: df['e'] = e
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())