Imam naslednji indeksirani podatkovni okvir z imenovanimi stolpci in vrsticami, ki niso neprekinjene številke:
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
V obstoječi podatkovni okvir bi rad dodal nov stolpec, 'e'
, pri čemer ne želim ničesar spremeniti v podatkovnem okviru (tj. novi stolpec ima vedno enako dolžino kot podatkovni okvir).
0 -0.335485
1 -1.166658
2 -0.385571
dtype: float64
Preizkusil sem različne različice join
, append
, merge
, vendar nisem dobil želenega rezultata, kvečjemu napake. Kako lahko zgornjemu primeru dodam stolpec e
?
Za ustvarjanje serije uporabite izvirne indekse df1:
df1['e'] = pd.Series(np.random.randn(sLength), index=df1.index)
Urejanje 2015
Nekateri so poročali, da so s to kodo dobili opozorilo SettingWithCopyWarning
.
Vendar pa koda še vedno deluje brezhibno s trenutno različico 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'
Opozorilo SettingWithCopyWarning
je namenjeno obveščanju o morebitni neveljavni dodelitvi na kopiji podatkovnega okvira. Ni nujno, da je bilo to narobe (lahko sproži lažno pozitivne rezultate), vendar vas od različice 0.13.0 dalje obvešča, da za isti namen obstajajo ustreznejše metode. Če se pojavi opozorilo, upoštevajte njegov nasvet: namesto tega poskusite uporabiti .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
>>>
Pravzaprav je to trenutno učinkovitejša metoda, kot je opisana v dokumentaciji pandas.
Urejanje 2017
Kot je navedeno v komentarjih in s strani @Alexander, je trenutno najboljša metoda za dodajanje vrednosti serije kot novega stolpca okvira podatkov assign
:
df1 = df1.assign(e=pd.Series(np.random.randn(sLength)).values)
Najučinkovitejše bo, če to storite neposredno prek NumPy:
df1['e'] = np.random.randn(sLength)
Opomba: moj prvotni (zelo star) predlog je bil uporabiti map
(ki je veliko počasnejši):
df1['e'] = df1['a'].map(lambda x: np.random.random())