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?

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

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

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

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.


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)


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

0

Terkadang sintaks ini tidak berfungsi:

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

Gunakan yang berikut ini sebagai gantinya:

df['col1','col2']
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.