Pandalar veri çerçevesi dolgusu () yalnızca bazı sütunlar yerinde


145

Yalnızca bazı sütun alt kümesi için 0 ile bir Pandas veri çerçevesinde hiçbir değeri doldurmaya çalışıyorum.

Ben yaparken:

import pandas as pd
df = pd.DataFrame(data={'a':[1,2,3,None],'b':[4,5,None,6],'c':[None,None,7,8]})
print df
df.fillna(value=0, inplace=True)
print df

Çıktı:

     a    b    c
0  1.0  4.0  NaN
1  2.0  5.0  NaN
2  3.0  NaN  7.0
3  NaN  6.0  8.0
     a    b    c
0  1.0  4.0  0.0
1  2.0  5.0  0.0
2  3.0  0.0  7.0
3  0.0  6.0  8.0

Her şeyi 's Noneile değiştirir 0. Ne yapmak istediğim, sadece yerine Nonesütunlarda s ave bancak c.

Bunu yapmanın en iyi yolu nedir?

Yanıtlar:


219

İstediğiniz sütunları seçebilir ve atama ile yapabilirsiniz:

df[['a', 'b']] = df[['a','b']].fillna(value=0)

Ortaya çıkan çıktı beklendiği gibi:

     a    b    c
0  1.0  4.0  NaN
1  2.0  5.0  NaN
2  3.0  0.0  7.0
3  0.0  6.0  8.0

Evet, tam olarak istediğim bu! Teşekkür ederim. Bunu yerinde yapmanın herhangi bir yolu var mı? Orijinal veri çerçevem ​​oldukça büyük.
Sait

1
Yine de orig
df'nin

4
Loc burada gereksiz, df[['a', 'b']] = df[['a','b']].fillna(value=0)yine de işe yarayacak
EdChum

2
@EdChum Geçici bir veri çerçevesi oluşturmuyor ve bu nedenle bunu yapmak için daha fazla belleğe ihtiyacı var mı? (Bellekle ilgili zaman karmaşıklığından daha fazla endişeliyim.)
Sait

7
Birçok işlem için, inplaceyine de bir kopya üzerinde çalışacaktır. Durumun böyle olup olmadığını bilmiyorum fillna. Panda yanıtları geliştiricilerinden birinden bu cevaba bakınız .
kök

85

Sen kullanarak yapabilirsiniz dict, fillnafarklı sütun için farklı bir değere sahip

df.fillna({'a':0,'b':0})
Out[829]: 
     a    b    c
0  1.0  4.0  NaN
1  2.0  5.0  NaN
2  3.0  0.0  7.0
3  0.0  6.0  8.0

Sonra geri atayın

df=df.fillna({'a':0,'b':0})
df
Out[831]: 
     a    b    c
0  1.0  4.0  NaN
1  2.0  5.0  NaN
2  3.0  0.0  7.0
3  0.0  6.0  8.0

1
gerçekten harika, Btw isterseniz kullanmak için dikte fromkeys, +1
U10-Forward

1
Farklı sütunlar için gerçekten farklı değerler göstermişse cevap / örnek daha net olacaktır.
RufusVS

@RufusVS doğru, ama yine de
op'un

1
Bu, kabul edilen cevabın daha iyi bir çözümdür, çünkü zincirleme indeksleme sorunlarını önler, örneğindf.fillna({'a':0,'b':0}, inplace=True)
Alex

19

Wen'nin çözümünü kullanarak nesnenin bir kopyasını yapmaktan kaçınabilirsiniz ve inplace = True:

df.fillna({'a':0, 'b':0}, inplace=True)
print(df)

Hangi verim:

     a    b    c
0  1.0  4.0  NaN
1  2.0  5.0  NaN
2  3.0  0.0  7.0
3  0.0  6.0  8.0

1
Bu doğru olsa da, bir kopyadan kaçınmak daha iyi değildir .
jpp

7

Hepsini tek bir satırda nasıl yapabileceğiniz aşağıda açıklanmıştır:

df[['a', 'b']].fillna(value=0, inplace=True)

Arıza: df[['a', 'b']]NaN değerlerini doldurmak istediğiniz sütunları seçer, value=0NaN'leri sıfırla doldurmasını söyler inplace=Trueve nesnenin bir kopyasını almak zorunda kalmadan değişiklikleri kalıcı hale getirir.


7

üst yanıtı kullanmak, df diliminin bir kopyasında değişiklik yapma konusunda bir uyarı verir. Başka sütunlarınız olduğunu varsayarsak, bunu yapmanın daha iyi bir yolu sözlük iletmektir:
df.fillna({'A': 'NA', 'B': 'NA'}, inplace=True)


3

Veya şöyle bir şey:

df.loc[df['a'].isnull(),'a']=0
df.loc[df['b'].isnull(),'b']=0

ve daha fazlası varsa:

for i in your_list:
    df.loc[df[i].isnull(),i]=0

0

Bazen bu sözdizimi çalışmaz:

df[['col1','col2']] = df[['col1','col2']].fillna()

Bunun yerine aşağıdakileri kullanın:

df['col1','col2']
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.