Python pandas'ta mevcut DataFrame'e yeni sütun ekleme

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?

Çözüm

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)
Yorumlar (27)

Bu, yeni bir sütun eklemenin basit yoludur: df['e'] = e

Yorumlar (4)

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())
Yorumlar (2)