Pandna dataframe fillna () hanya beberapa kolom di tempat

144

Saya mencoba untuk mengisi nilai dalam dataframe Pandas dengan 0 untuk hanya beberapa subset kolom.

Ketika saya melakukannya:

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

Hasil:

     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

Ini menggantikan setiap Nonedengan 0. Yang ingin saya lakukan adalah, hanya mengganti Nones di kolom adan b, tetapi tidak c.

Apa cara terbaik untuk melakukan ini?

Sait
sumber

Jawaban:

218

Anda dapat memilih kolom yang Anda inginkan dan melakukannya dengan tugas:

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

Output yang dihasilkan seperti yang diharapkan:

     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
akar
sumber
Ya, inilah yang saya inginkan! Terima kasih. Adakah cara untuk melakukan ini di tempat? Kerangka data asli saya cukup besar.
Sait
1
Saya tidak berpikir ada keuntungan kinerja dengan melakukan ini di tempat karena Anda menimpa asal df pula
EdChum
4
df[['a', 'b']] = df[['a','b']].fillna(value=0)
Lokasinya
2
@ EdChum Bukankah ini menghasilkan kerangka data sementara dan karenanya membutuhkan lebih banyak memori untuk melakukannya? (Saya lebih mementingkan ingatan daripada kompleksitas waktu.)
Sait
7
Untuk banyak operasi, inplacemasih akan bekerja pada salinan. Saya tidak tahu apakah ini benar fillnaatau tidak. Lihat jawaban ini dari salah satu pengembang inti panda.
root
85

Anda dapat menggunakan dict, fillnadengan nilai berbeda untuk kolom berbeda

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

Setelah menetapkan kembali

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
YOBEN_S
sumber
1
sangat keren, Btw untuk dict yang dapat Anda gunakan fromkeysjika Anda mau, +1
U10-Forward
1
Jawaban / contoh akan lebih jelas jika benar-benar menunjukkan nilai yang berbeda untuk kolom yang berbeda.
RufusVS
@RufusVS yang benar, tetapi masih mencoba untuk mencocokkan keluaran yang diharapkan op
YOBEN_S
1
Ini adalah solusi yang lebih baik daripada jawaban yang diterima, karena itu menghindari masalah pengindeksan berantai, misalnya jika digunakan dengandf.fillna({'a':0,'b':0}, inplace=True)
Alex
19

Anda dapat menghindari membuat salinan objek menggunakan solusi Wen dan inplace = Benar:

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

Yang menghasilkan:

     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
Leesa H.
sumber
1
Meskipun ini benar, menghindari salinan tidak selalu lebih baik .
jpp
7

Inilah cara Anda dapat melakukan semuanya dalam satu baris:

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

Breakdown: df[['a', 'b']]memilih kolom yang ingin Anda isi dengan nilai NaN, value=0memintanya untuk mengisi NaN dengan nol, dan inplace=Trueakan membuat perubahan permanen, tanpa harus membuat salinan objek.

Josephine M. Ho
sumber
7

menggunakan jawaban teratas menghasilkan peringatan tentang membuat perubahan pada salinan df slice. Dengan anggapan Anda memiliki kolom lain, cara yang lebih baik untuk melakukannya adalah dengan menggunakan kamus:
df.fillna({'A': 'NA', 'B': 'NA'}, inplace=True)

Jonathan
sumber
3

Atau sesuatu seperti:

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

dan jika ada lagi:

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

Terkadang sintaks ini tidak berfungsi:

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

Gunakan yang berikut ini sebagai gantinya:

df['col1','col2']
Sarath Baby
sumber