Python pandalarındaki mevcut DataFrame'e yeni sütun ekleme


978

Adlandırılmış sütunlar ve satırlar sürekli olmayan numaraları ile aşağıdaki dizinlenmiş DataFrame var:

          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

'e'Varolan veri çerçevesine yeni bir sütun eklemek istiyorum ve veri çerçevesindeki bir şey değiştirmek istemiyorum (yani, yeni sütun her zaman DataFrame ile aynı uzunlukta).

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

eYukarıdaki örneğe nasıl sütun ekleyebilirim ?

Yanıtlar:


1043

Diziyi oluşturmak için orijinal df1 dizinlerini kullanın:

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

Düzenle 2015
Bazıları SettingWithCopyWarningbu kodla alma bildirildi .
Ancak, kod hala geçerli panda sürüm 0.16.1 ile mükemmel çalışı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'

Veri SettingWithCopyWarningÇerçevesinin bir kopyası üzerinde muhtemelen geçersiz bir ödev hakkında bilgi vermeyi amaçlamaktadır. Mutlaka yanlış yaptığınızı söylemez (yanlış pozitifleri tetikleyebilir), ancak 0.13.0'dan itibaren aynı amaç için daha yeterli yöntemler olduğunu size bildirir. Daha sonra, uyarıyı alırsanız tavsiyesine uymanız yeterlidir: Bunun yerine .loc [row_index, col_indexer] = değerini 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 panda dokümanlarında açıklandığı gibi daha verimli bir yöntemdir


2017'yi düzenle

Yorumlarda ve @Alexander tarafından belirtildiği gibi, şu anda bir Series'in değerlerini bir DataFrame'in yeni sütunu olarak eklemenin en iyi yöntemi aşağıdakileri kullanıyor olabilir assign:

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

24
sütunun başına başlamanız gerekiyorsa DataFrame.insert kullanın: df1.insert (0, 'A', Seri (np.random.randn (sLength), dizin = df1.index))
lowtech

29
Pandalar 0.12 sürümünden itibaren, bu sözdiziminin uygun olmadığına ve uyarı verdiğine inanıyorum:SettingWithCopyWarning: A value is trying to be set on a copy of a slice from a DataFrame. Try using .loc[row_index,col_indexer] = value instead
Zhubarb

6
Setting.WithCopy uyarısı olarak .loc sonrasında bir şekilde daha fazla uyarı verilir: ... self.obj [item_labels [index_ [info_axis]]]] = değer
seongjoo 3:30 '

12
@toto_tico Bir kwargssözlüğü şu şekilde açabilirsiniz :df1 = df1.assign(**{'e': p.Series(np.random.randn(sLength)).values})
TC Proctor

23
"Şu anda" veya referans yıllarını söylemek yerine, lütfen pandaların sürüm numaralarına bakın, örneğin "0.14-0.16 do X arasında, 0.17+ do Y'de ..."
smci

229

Yeni bir sütun eklemenin basit yolu budur: df['e'] = e


153
Oyların yüksek olmasına rağmen: bu cevap yanlış . OP'nin sürekli olmayan dizinleri olan bir veri çerçevesi olduğunu ve e( Series(np.random.randn(sLength))) dizinli bir 0-n Serisi oluşturduğunu unutmayın. Bunu df1'e atarsanız, bazı NaN hücreleri alırsınız.
joaquin

32
@Joaquin'in söylediği doğrudur, ancak bunu aklınızda bulundurduğunuz sürece, bu çok yararlı bir kısayoldur.
VedTopkar

2
@Eric Leschinski: Düzenlemenin bu soruya nasıl yardımcı olacağından emin değilim. my_dataframe = pd.DataFrame(columns=('foo', 'bar')). Düzenlemenizi geri
döndürmek

1
Bu yardımcı olmaz, çünkü birden fazla satırınız varsa ve atamayı kullanırsanız, yeni sütunun tüm satırlarını genellikle istenmeyen bir değerle (sizin durumunuzda e) atar.
Paniz

156

Mevcut veri çerçevesine yeni bir sütun 'e' eklemek istiyorum ve veri çerçevesindeki hiçbir şeyi değiştirmiyorum. (Seri her zaman bir veri çerçevesi ile aynı uzunluğa sahiptir.)

Ben indeks değerleri içinde eolanlar ile eşleştiğini varsayıyorum df1.

Adlı yeni bir sütun başlatmanın ve bu sütunu eserilerinizdeki değerleri atamanın en kolay yolu e:

df['e'] = e.values

atama (Pandalar 0.16.0+)

Pandalar 0.16.0'dan itibaren, assignbir DataFrame'e yeni sütunlar atayan ve yenilerine ek olarak tüm orijinal sütunlarla birlikte yeni bir nesne (kopya) döndüren de kullanabilirsiniz .

df1 = df1.assign(e=e.values)

Başı olarak , bu örnekte (aynı zamanda kaynak kodunu içeren assignfonksiyonu), aynı zamanda birden fazla sütun şunları içerebilir:

df = pd.DataFrame({'a': [1, 2], 'b': [3, 4]})
>>> df.assign(mean_a=df.a.mean(), mean_b=df.b.mean())
   a  b  mean_a  mean_b
0  1  3     1.5     3.5
1  2  4     1.5     3.5

Örneğiniz bağlamında:

np.random.seed(0)
df1 = pd.DataFrame(np.random.randn(10, 4), columns=['a', 'b', 'c', 'd'])
mask = df1.applymap(lambda x: x <-0.7)
df1 = df1[-mask.any(axis=1)]
sLength = len(df1['a'])
e = pd.Series(np.random.randn(sLength))

>>> df1
          a         b         c         d
0  1.764052  0.400157  0.978738  2.240893
2 -0.103219  0.410599  0.144044  1.454274
3  0.761038  0.121675  0.443863  0.333674
7  1.532779  1.469359  0.154947  0.378163
9  1.230291  1.202380 -0.387327 -0.302303

>>> e
0   -1.048553
1   -1.420018
2   -1.706270
3    1.950775
4   -0.509652
dtype: float64

df1 = df1.assign(e=e.values)

>>> df1
          a         b         c         d         e
0  1.764052  0.400157  0.978738  2.240893 -1.048553
2 -0.103219  0.410599  0.144044  1.454274 -1.420018
3  0.761038  0.121675  0.443863  0.333674 -1.706270
7  1.532779  1.469359  0.154947  0.378163  1.950775
9  1.230291  1.202380 -0.387327 -0.302303 -0.509652

Bu yeni özelliğin ilk sunulduğu andaki açıklaması burada bulunabilir .


2
İki yöntemin göreceli performansı hakkında herhangi bir yorum, birinci yöntemin ( df['e'] = e.values) veri çerçevesinin bir kopyasını oluşturmadığını düşünürken, ikinci seçenek (kullanma df.assign) yapar mı? Çok sayıda yeni sütunun ardışık olarak eklenmesi ve büyük veri çerçeveleri olması durumunda, ilk yöntemin çok daha iyi performans göstermesini beklerdim.
jhin

2
@jhin Evet, sabit bir veri çerçevesi üzerinde çalışıyorsanız doğrudan atama çok açıktır. Kullanmanın yararı, assignoperasyonlarınızı zincirlendirmektir.
Alexander

Bu kesinlikle açık ve kapalı arasında iyi bir denge gibi görünüyor. +1: D
Abe Hoffman

2
Eğlence içindf.assign(**df.mean().add_prefix('mean_'))
piRSquared

1
@Owlright Sorudan, OP'nin veri çerçevelerini birleştirdiği ve dizini görmezden geldiği anlaşılıyor. Bu durumda, yukarıdaki yöntemler işe yarayacaktır. Kişi dizini saklamak istiyorsa df_new = pd.concat([df1, df2], axis=1), ignore_index=Falsevarsayılan olarak buna dikkat ederek benzer bir şey kullanın .
Alexander

51

Son panda versiyonlarında gitmenin yolu df.assign kullanmaktır :

df1 = df1.assign(e=np.random.randn(sLength))

Üretmez SettingWithCopyWarning.


1
@Smci'nin yorumu yukarıdan kopyalanıyor ... Şu anda "şu an" veya referans yılı söylemek yerine, lütfen Panda'nın sürüm numaralarına bakın
Kyle C

50

Bunu doğrudan NumPy ile yapmak en verimli yöntem olacaktır:

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

Orijinal (çok eski) önerimin map(çok daha yavaş) kullanmak olduğunu unutmayın:

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

1
Cevabınız için teşekkürler, daha önce verdiğim gibi, .mapyerine mevcut dizileri kullanmak için kodunuzu değiştirebilir miyim lambda? Deniyorum df1['e'] = df1['a'].map(lambda x: e)ya da df1['e'] = df1['a'].map(e)ihtiyacım olan şey değil. (Pyhon'da yeniyim ve önceki cevabın bana zaten yardımcı oldu)
tomasz74

@ tomasz74 Zaten ebir Seri olarak varsa o zaman kullanmanız gerekmez map, kullanın df['e']=e(@joaquins cevap).
Andy Hayden

49

Süper basit sütun ataması

Bir panda veri çerçevesi, sütunların sıralı bir diktesi olarak uygulanır.

Bu, __getitem__ []yalnızca belirli bir sütunu almak için değil, aynı __setitem__ [] =zamanda yeni bir sütun atamak için de kullanılabileceği anlamına gelir .

Örneğin, bu veri çerçevesinde yalnızca []erişimciyi kullanarak bir sütun eklenebilir

    size      name color
0    big      rose   red
1  small    violet  blue
2  small     tulip   red
3  small  harebell  blue

df['protected'] = ['no', 'no', 'no', 'yes']

    size      name color protected
0    big      rose   red        no
1  small    violet  blue        no
2  small     tulip   red        no
3  small  harebell  blue       yes

Veri çerçevesinin dizini kapalı olsa bile bunun işe yaradığını unutmayın.

df.index = [3,2,1,0]
df['protected'] = ['no', 'no', 'no', 'yes']
    size      name color protected
3    big      rose   red        no
2  small    violet  blue        no
1  small     tulip   red        no
0  small  harebell  blue       yes

[] = gidilecek yol ama dikkat edin!

Ancak, pd.Seriesbir dizininiz varsa ve bunu dizinlerin kapalı olduğu bir veri çerçevesine atamaya çalışırsanız, sorun yaşarsınız. Örneğe bakın:

df['protected'] = pd.Series(['no', 'no', 'no', 'yes'])
    size      name color protected
3    big      rose   red       yes
2  small    violet  blue        no
1  small     tulip   red        no
0  small  harebell  blue        no

Bunun nedeni pd.Series, a'nın varsayılan olarak 0'dan n'ye kadar numaralandırılmış bir dizinine sahip olmasıdır. Ve panda [] =yöntemi "akıllı" olmaya çalışıyor

Aslında neler oluyor.

[] =Metodu kullandığınızda pandalar sessizce bir sol birleşim veya dış birleştirme işlemini sol el veri çerçevesinin dizinini ve sağ el serisinin dizinini kullanarak gerçekleştiriyor.df['column'] = series

Kenar notu

Bu []=yöntem hızlı bir şekilde bilişsel uyumsuzluğa neden olur, çünkü yöntem girdiye bağlı olarak birçok farklı şey yapmaya çalışır ve pandaların nasıl çalıştığını bilmediğiniz sürece sonuç tahmin edilemez . Bu nedenle []=kod bazında karşı tavsiye ediyorum , ama bir dizüstü bilgisayardaki verileri araştırırken, sorun değil.

Sorunun etrafından dolaşmak

Eğer varsa pd.Seriesve yukarıdan aşağıya atanmasını istiyorsanız veya üretken kod kodluyorsanız ve dizin sırasından emin değilseniz, bu tür bir sorun için korunmaya değer.

pd.SeriesBir np.ndarrayveya a 'ya mahsup olabilirsiniz list, bu hile yapar.

df['protected'] = pd.Series(['no', 'no', 'no', 'yes']).values

veya

df['protected'] = list(pd.Series(['no', 'no', 'no', 'yes']))

Ama bu çok açık değil.

Bazı kodlayıcı gelip "Hey, bu gereksiz görünüyor, bunu optimize edeceğim" diyebilir.

Açık yol

'Nin indeksini' nin endeksi pd.Seriesolacak şekilde ayarlamak dfaçıktır.

df['protected'] = pd.Series(['no', 'no', 'no', 'yes'], index=df.index)

Ya da daha gerçekçi bir şekilde, muhtemelen pd.Serieszaten hazırsınız demektir.

protected_series = pd.Series(['no', 'no', 'no', 'yes'])
protected_series.index = df.index

3     no
2     no
1     no
0    yes

Şimdi atanabilir

df['protected'] = protected_series

    size      name color protected
3    big      rose   red        no
2  small    violet  blue        no
1  small     tulip   red        no
0  small  harebell  blue       yes

İle alternatif bir yol df.reset_index()

Dizin uyumsuzluğu sorun olduğundan, veri çerçevesinin dizininin bir şey dikte etmemesi gerektiğini düşünüyorsanız, dizini düşürebilirsiniz , bu daha hızlı olmalıdır, ancak çok temiz değil, çünkü işleviniz muhtemelen iki şey yapıyor.

df.reset_index(drop=True)
protected_series.reset_index(drop=True)
df['protected'] = protected_series

    size      name color protected
0    big      rose   red        no
1  small    violet  blue        no
2  small     tulip   red        no
3  small  harebell  blue       yes

Hakkında not df.assign

df.assignNe yaptığınızı daha açık hale getirirken , aslında yukarıdakiyle aynı sorunlara sahiptir.[]=

df.assign(protected=pd.Series(['no', 'no', 'no', 'yes']))
    size      name color protected
3    big      rose   red       yes
2  small    violet  blue        no
1  small     tulip   red        no
0  small  harebell  blue        no

Sadece df.assignsütununuzun çağrılmadığına dikkat edin self. Hatalara neden olur. Bu df.assign kokuyor , çünkü işlevde bu tür eserler var.

df.assign(self=pd.Series(['no', 'no', 'no', 'yes'])
TypeError: assign() got multiple values for keyword argument 'self'

"Peki, o zaman kullanmayacağım" diyebilirsiniz self. Ancak yeni argümanları desteklemek için bu işlevin gelecekte nasıl değişeceğini kim bilebilir. Belki sütun adınız yeni bir panda güncellemesinde bir argüman olacak ve yükseltme ile ilgili sorunlara neden olacaktır.


6
" Bu [] =yöntemi kullandığınızda pandalar sessizce bir dış birleştirme veya dış birleştirme gerçekleştiriyor ". Bu, tüm konunun en önemli bilgisidir. Ancak []=operatörün nasıl çalıştığına ilişkin resmi belgelere bağlantı sağlayabilir misiniz ?
Lightman


23

Yeni sütunun tamamını bir başlangıç ​​taban değerine (ör. None) Ayarlamak istiyorsanız , bunu yapabilirsiniz:df1['e'] = None

Bu aslında hücreye "nesne" türü atayacaktır. Böylece daha sonra liste gibi karmaşık veri türlerini tek tek hücrelere koyabilirsiniz.


1
bu, bir ayar ile uyarır.
00__00__00

1
df ['E'] = '', birisi boş bir sütun eklemek istiyorsa da çalışır
debaonline4u

21

Ben korkunç var SettingWithCopyWarningve bu iLOC sözdizimi kullanılarak sabit değildi. Benim DataFrame bir ODBC kaynağından read_sql tarafından oluşturuldu. Yukarıdaki lowtech'in bir önerisini kullanarak aşağıdakiler benim için çalıştı:

df.insert(len(df.columns), 'e', pd.Series(np.random.randn(sLength),  index=df.index))

Bu, sütunu sonuna eklemek için iyi çalıştı. En verimli olup olmadığını bilmiyorum, ancak uyarı mesajlarını sevmiyorum. Bence daha iyi bir çözüm var, ama bulamıyorum ve bence indeksin bazı yönlerine bağlı.
Not . Bunun yalnızca bir kez çalıştığını ve üzerine ve mevcut sütunun üzerine yazmaya çalışırken bir hata mesajı vereceğini unutmayın.
Not Yukarıdaki gibi ve 0.16.0'dan itibaren atamak en iyi çözümdür. Http://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.assign.html#pandas.DataFrame.assign Ara değerlerinizin üzerine yazmadığınız veri akışı türü için iyi çalışır belgelerine bakın .


2019'da benim için çalışan tek yol bu!
hydradon

14
  1. İlk önce list_of_eilgili verileri içeren bir python oluşturun .
  2. Bunu kullan: df['e'] = list_of_e

1
Gerçekten anlamıyorum, neden bu tercih edilen cevap değil. Bir pd.Series'iniz varsa, tolist()komut yardımcı olabilir.
Yani S

11

Eklemeye çalıştığınız sütun bir dizi değişkeni ise:

df["new_columns_name"]=series_variable_name #this will do it for you

Varolan bir sütunu değiştirseniz bile bu işe yarar. Sadece değiştirmek istediğiniz sütunla aynı new_columns_name yazın. Varolan sütun verilerinin yeni seri verileri üzerine yazılması yeterlidir.


10

Veri çerçevesi ve Seri nesne varsa aynı indeksi , pandas.concatburada da çalışır:

import pandas as pd
df
#          a            b           c           d
#0  0.671399     0.101208   -0.181532    0.241273
#1  0.446172    -0.243316    0.051767    1.577318
#2  0.614758     0.075793   -0.451460   -0.012493

e = pd.Series([-0.335485, -1.166658, -0.385571])    
e
#0   -0.335485
#1   -1.166658
#2   -0.385571
#dtype: float64

# here we need to give the series object a name which converts to the new  column name 
# in the result
df = pd.concat([df, e.rename("e")], axis=1)
df

#          a            b           c           d           e
#0  0.671399     0.101208   -0.181532    0.241273   -0.335485
#1  0.446172    -0.243316    0.051767    1.577318   -1.166658
#2  0.614758     0.075793   -0.451460   -0.012493   -0.385571

Aynı dizine sahip olmamaları durumunda:

e.index = df.index
df = pd.concat([df, e.rename("e")], axis=1)

10

kusursuz:

df.loc[:, 'NewCol'] = 'New_Val'

Misal:

df = pd.DataFrame(data=np.random.randn(20, 4), columns=['A', 'B', 'C', 'D'])

df

           A         B         C         D
0  -0.761269  0.477348  1.170614  0.752714
1   1.217250 -0.930860 -0.769324 -0.408642
2  -0.619679 -1.227659 -0.259135  1.700294
3  -0.147354  0.778707  0.479145  2.284143
4  -0.529529  0.000571  0.913779  1.395894
5   2.592400  0.637253  1.441096 -0.631468
6   0.757178  0.240012 -0.553820  1.177202
7  -0.986128 -1.313843  0.788589 -0.707836
8   0.606985 -2.232903 -1.358107 -2.855494
9  -0.692013  0.671866  1.179466 -1.180351
10 -1.093707 -0.530600  0.182926 -1.296494
11 -0.143273 -0.503199 -1.328728  0.610552
12 -0.923110 -1.365890 -1.366202 -1.185999
13 -2.026832  0.273593 -0.440426 -0.627423
14 -0.054503 -0.788866 -0.228088 -0.404783
15  0.955298 -1.430019  1.434071 -0.088215
16 -0.227946  0.047462  0.373573 -0.111675
17  1.627912  0.043611  1.743403 -0.012714
18  0.693458  0.144327  0.329500 -0.655045
19  0.104425  0.037412  0.450598 -0.923387


df.drop([3, 5, 8, 10, 18], inplace=True)

df

           A         B         C         D
0  -0.761269  0.477348  1.170614  0.752714
1   1.217250 -0.930860 -0.769324 -0.408642
2  -0.619679 -1.227659 -0.259135  1.700294
4  -0.529529  0.000571  0.913779  1.395894
6   0.757178  0.240012 -0.553820  1.177202
7  -0.986128 -1.313843  0.788589 -0.707836
9  -0.692013  0.671866  1.179466 -1.180351
11 -0.143273 -0.503199 -1.328728  0.610552
12 -0.923110 -1.365890 -1.366202 -1.185999
13 -2.026832  0.273593 -0.440426 -0.627423
14 -0.054503 -0.788866 -0.228088 -0.404783
15  0.955298 -1.430019  1.434071 -0.088215
16 -0.227946  0.047462  0.373573 -0.111675
17  1.627912  0.043611  1.743403 -0.012714
19  0.104425  0.037412  0.450598 -0.923387

df.loc[:, 'NewCol'] = 0

df
           A         B         C         D  NewCol
0  -0.761269  0.477348  1.170614  0.752714       0
1   1.217250 -0.930860 -0.769324 -0.408642       0
2  -0.619679 -1.227659 -0.259135  1.700294       0
4  -0.529529  0.000571  0.913779  1.395894       0
6   0.757178  0.240012 -0.553820  1.177202       0
7  -0.986128 -1.313843  0.788589 -0.707836       0
9  -0.692013  0.671866  1.179466 -1.180351       0
11 -0.143273 -0.503199 -1.328728  0.610552       0
12 -0.923110 -1.365890 -1.366202 -1.185999       0
13 -2.026832  0.273593 -0.440426 -0.627423       0
14 -0.054503 -0.788866 -0.228088 -0.404783       0
15  0.955298 -1.430019  1.434071 -0.088215       0
16 -0.227946  0.047462  0.373573 -0.111675       0
17  1.627912  0.043611  1.743403 -0.012714       0
19  0.104425  0.037412  0.450598 -0.923387       0

2
Kusursuz değil. Bu, OP'nin şu andaki veri çerçevesi ve yeni serilerin endekslerinin hizalanmadığı sorusunu ele almaz.
Alexander

7

Bana sadece sadece için olduğu gibi, bu ekleyelim hum3 , .locçözmedi SettingWithCopyWarningve ben başvurmak zorunda kaldı df.insert(). Benim durumumda yanlış pozitif "sahte" zincir indeksleme ile üretildi dict['a']['e'], burada 'e'yeni sütun ve dict['a']sözlükten gelen bir DataFrame.

Ayrıca ne yaptığınızı biliyorsanız, pd.options.mode.chained_assignment = None burada verilen diğer çözümlerden birini kullanarak ve daha sonra uyarıyı değiştirebileceğinizi de unutmayın .


7

bir veri çerçevesine belirli bir konuma yeni bir sütun eklemek için (0 <= loc <= sütun miktarı), Dataframe.insert komutunu kullanın:

DataFrame.insert(loc, column, value)

Bu nedenle, df adlı bir veri çerçevesinin sonuna e sütununu eklemek istiyorsanız, şunu kullanabilirsiniz:

e = [-0.335485, -1.166658, -0.385571]    
DataFrame.insert(loc=len(df.columns), column='e', value=e)

değer bir Seri, bir tam sayı (bu durumda tüm hücreler bu bir değerle doldurulur) veya dizi benzeri bir yapı olabilir

https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.insert.html


6

Yeni bir sütun atamadan önce, dizine eklenmiş verileriniz varsa dizini sıralamanız gerekir. En azından benim durumumda:

data.set_index(['index_column'], inplace=True)
"if index is unsorted, assignment of a new column will fail"        
data.sort_index(inplace = True)
data.loc['index_value1', 'column_y'] = np.random.randn(data.loc['index_value1', 'column_x'].shape[0])

6

Dikkat edilmesi gereken bir şey, eğer

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

bu etkin bir şekilde df1.index üzerinde sol birleştirme olacaktır. Dış birleştirme efekti elde etmek istiyorsanız , muhtemelen kusurlu çözümüm, verilerinizin evrenini kapsayan dizin değerlerine sahip bir veri çerçevesi oluşturmak ve daha sonra yukarıdaki kodu kullanmaktır. Örneğin,

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

5

numpy.nanAptal olmadan bir veri karesine s sütun eklemenin genel bir yol arıyordu SettingWithCopyWarning.

Aşağıdakilerden:

  • buradaki cevaplar
  • bir değişkeni anahtar kelime bağımsız değişkeni olarak geçirmeyle ilgili bu soru
  • numpysatır içi bir NaN dizisi oluşturmak için bu yöntem

Ben bununla geldim:

col = 'column_name'
df = df.assign(**{col:numpy.full(len(df), numpy.nan)})

4

Mevcut veri çerçevesine yeni bir 'e' sütunu eklemek için

 df1.loc[:,'e'] = Series(np.random.randn(sLength))

Ayrıca uyarı mesajı verir
B Furtado

df1.loc kullanmalısınız [::, 'e'] = Seri (np.random.randn (sLength))
Hermes Morales

4

Tamlık uğruna - DataFrame.eval () yöntemini kullanan başka bir çözüm :

Veri:

In [44]: e
Out[44]:
0    1.225506
1   -1.033944
2   -0.498953
3   -0.373332
4    0.615030
5   -0.622436
dtype: float64

In [45]: df1
Out[45]:
          a         b         c         d
0 -0.634222 -0.103264  0.745069  0.801288
4  0.782387 -0.090279  0.757662 -0.602408
5 -0.117456  2.124496  1.057301  0.765466
7  0.767532  0.104304 -0.586850  1.051297
8 -0.103272  0.958334  1.163092  1.182315
9 -0.616254  0.296678 -0.112027  0.679112

Çözüm:

In [46]: df1.eval("e = @e.values", inplace=True)

In [47]: df1
Out[47]:
          a         b         c         d         e
0 -0.634222 -0.103264  0.745069  0.801288  1.225506
4  0.782387 -0.090279  0.757662 -0.602408 -1.033944
5 -0.117456  2.124496  1.057301  0.765466 -0.498953
7  0.767532  0.104304 -0.586850  1.051297 -0.373332
8 -0.103272  0.958334  1.163092  1.182315  0.615030
9 -0.616254  0.296678 -0.112027  0.679112 -0.622436

4

Boş bir sütun oluşturmak için

df['i'] = None

3

Yaptığım şey şu ki ... Ama genel olarak pandalar ve gerçekten Python için oldukça yeniyim, bu yüzden vaat yok.

df = pd.DataFrame([[1, 2], [3, 4], [5,6]], columns=list('AB'))

newCol = [3,5,7]
newName = 'C'

values = np.insert(df.values,df.shape[1],newCol,axis=1)
header = df.columns.values.tolist()
header.append(newName)

df = pd.DataFrame(values,columns=header)

3

Eğer alırsanız SettingWithCopyWarning, kolay bir düzeltme sütun eklemeye çalıştığınız DataFrame'i kopyalamaktır.

df = df.copy()
df['col_name'] = values

10
Bu iyi bir fikir değil. Veri çerçevesi yeterince büyükse, bellek yoğun olacaktır ... Ayrıca arada bir sütun eklemeye devam ederseniz bir kabusa dönüşecektir.
Kevad
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.