Adlandırılmış sütunlara ve sürekli olmayan sayılara sahip aşağıdaki indeksli DataFrame'e sahibim:
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
Mevcut veri çerçevesine 'e'
adında yeni bir sütun eklemek istiyorum ve veri çerçevesindeki hiçbir şeyi değiştirmek istemiyorum (yani, yeni sütun her zaman DataFrame ile aynı uzunlukta olacak).
0 -0.335485
1 -1.166658
2 -0.385571
dtype: float64
Farklı join
, append
, merge
sürümlerini denedim, ancak istediğim sonucu alamadım, sadece en fazla hata aldım. Yukarıdaki örneğe e
sütununu nasıl ekleyebilirim?
Seriyi oluşturmak için orijinal df1 dizinlerini kullanın:
df1['e'] = pd.Series(np.random.randn(sLength), index=df1.index)
Edit 2015
Bazıları bu kodla SettingWithCopyWarning
uyarısı aldığını bildirmiştir.
Bununla birlikte, kod mevcut pandas sürümü 0.16.1 ile hala mükemmel bir şekilde çalışmaktadır.
>>> 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'
SettingWithCopyWarning`, Dataframe'in bir kopyası üzerindeki muhtemelen geçersiz bir atama hakkında bilgi vermeyi amaçlar. Mutlaka yanlış yaptığınızı söylemez (yanlış pozitifleri tetikleyebilir), ancak 0.13.0'dan itibaren aynı amaç için daha uygun yöntemler olduğunu bilmenizi sağlar. Sonra, eğer uyarı alırsanız, sadece tavsiyesini takip edin: Bunun yerine .loc[row_index,col_indexer] = value kullanmayı deneyin
>>> 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
>>>
Aslında, bu şu anda pandas dokümanlarında açıklandığı gibi daha verimli bir yöntemdir.
Düzenleme 2017
Yorumlarda ve @Alexander tarafından belirtildiği gibi, şu anda bir Serinin değerlerini bir DataFrame'in yeni bir sütunu olarak eklemek için en iyi yöntem assign
kullanmak olabilir:
df1 = df1.assign(e=pd.Series(np.random.randn(sLength)).values)
Bu, yeni bir sütun eklemenin basit yoludur: df['e'] = e
Bunu doğrudan NumPy aracılığıyla yapmak en verimli yöntem olacaktır:
df1['e'] = np.random.randn(sLength)
Orijinal (çok eski) önerimin map
kullanmak olduğunu unutmayın (ki bu çok daha yavaştır):
df1['e'] = df1['a'].map(lambda x: np.random.random())