Bagaimana saya bisa mengganti semua nilai NaN dengan Nol di kolom bingkai data panda


458

Saya memiliki dataframe seperti di bawah ini

      itm Date                  Amount 
67    420 2012-09-30 00:00:00   65211
68    421 2012-09-09 00:00:00   29424
69    421 2012-09-16 00:00:00   29877
70    421 2012-09-23 00:00:00   30990
71    421 2012-09-30 00:00:00   61303
72    485 2012-09-09 00:00:00   71781
73    485 2012-09-16 00:00:00     NaN
74    485 2012-09-23 00:00:00   11072
75    485 2012-09-30 00:00:00  113702
76    489 2012-09-09 00:00:00   64731
77    489 2012-09-16 00:00:00     NaN

ketika saya mencoba. Menerapkan fungsi ke kolom Jumlah saya mendapatkan kesalahan berikut.

ValueError: cannot convert float NaN to integer

Saya telah mencoba menerapkan fungsi menggunakan .isnan dari Modul Matematika. Saya telah mencoba panda. Ganti atribut. Saya mencoba atribut. Saya juga telah melihat artikel ini. Bagaimana cara mengganti nilai-nilai NA dengan nol dalam kerangka data R? sambil melihat beberapa artikel lainnya. Semua metode yang saya coba belum berhasil atau tidak mengenali NaN. Setiap Petunjuk atau solusi akan dihargai.


Satu-satunya masalah adalah df.fill.na () tidak berfungsi jika frame data yang Anda terapkan di-resampled atau telah diiris melalui fungsi loc
Prince Agarwal

Jawaban:


754

Saya percaya DataFrame.fillna()akan melakukan ini untuk Anda.

Tautan ke Documents untuk kerangka data dan Seri .

Contoh:

In [7]: df
Out[7]: 
          0         1
0       NaN       NaN
1 -0.494375  0.570994
2       NaN       NaN
3  1.876360 -0.229738
4       NaN       NaN

In [8]: df.fillna(0)
Out[8]: 
          0         1
0  0.000000  0.000000
1 -0.494375  0.570994
2  0.000000  0.000000
3  1.876360 -0.229738
4  0.000000  0.000000

Untuk mengisi NaN hanya dalam satu kolom, pilih saja kolom itu. dalam hal ini saya menggunakan inplace = Benar untuk benar-benar mengubah isi df.

In [12]: df[1].fillna(0, inplace=True)
Out[12]: 
0    0.000000
1    0.570994
2    0.000000
3   -0.229738
4    0.000000
Name: 1

In [13]: df
Out[13]: 
          0         1
0       NaN  0.000000
1 -0.494375  0.570994
2       NaN  0.000000
3  1.876360 -0.229738
4       NaN  0.000000

EDIT:

Untuk menghindari a SettingWithCopyWarning, gunakan fungsionalitas khusus kolom bawaan:

df.fillna({1:0}, inplace=True)

1
Apakah dijamin itu df[1]adalah tampilan dan bukan salinan DF asli? Jelas, jika ada situasi langka di mana salinannya, itu akan menyebabkan bug yang sangat merepotkan. Apakah ada pernyataan yang jelas tentang hal itu dalam dokumentasi panda?
Maks

@ Max Lihat ini, mungkin menjawab pertanyaan Anda: stackoverflow.com/questions/23296282/…
Aman

Terima kasih. Apakah pemahaman saya benar bahwa dalam jawaban itu "pengindeks yang menetapkan" adalah operasi pengindeksan terluar (dijalankan tepat sebelum penugasan. Jadi setiap penugasan yang hanya menggunakan pengindeks tunggal dijamin aman, membuat kode Anda aman?
maks

1
Mengapa ini tidak berhasil untuk saya? lihat: stackoverflow.com/questions/39452095/how-to-fillna-with-value-0
displayname

1
contoh terakhir melempar SettingWithCopyWarning
Sip

124

Tidak dijamin bahwa pengirisan mengembalikan tampilan atau salinan. Anda dapat melakukan

df['column'] = df['column'].fillna(value)

14
Baru saja menemukan masalah "inplace = True". Jawaban ini menghindari masalah dan saya pikir solusi paling bersih yang disajikan.
TimCera

48

Anda dapat menggunakan replaceuntuk mengubah NaNke 0:

import pandas as pd
import numpy as np

# for column
df['column'] = df['column'].replace(np.nan, 0)

# for whole dataframe
df = df.replace(np.nan, 0)

# inplace
df.replace(np.nan, 0, inplace=True)

Apakah hanya akan diganti NaN? atau itu juga akan menggantikan nilai di mana NAatau NaNsuka df.fillna(0)? Saya mencari solusi yang hanya menggantikan nilai di mana ada NaNdan tidakNA
Shyam Bhimani

1
@ShyamBhimani itu harus menggantikan hanya NaNnilai yaitu di mana np.isnanBenar
Anton Protopopov

23

Saya hanya ingin memberikan sedikit pembaruan / kasus khusus karena sepertinya orang masih datang ke sini. Jika Anda menggunakan multi-indeks atau menggunakan slicer indeks, inplace = opsi True mungkin tidak cukup untuk memperbarui slice yang Anda pilih. Misalnya dalam multi-indeks level 2x2 ini tidak akan mengubah nilai apa pun (pada panda 0.15):

idx = pd.IndexSlice
df.loc[idx[:,mask_1],idx[mask_2,:]].fillna(value=0,inplace=True)

"Masalahnya" adalah bahwa rantai merusak kemampuan fillna untuk memperbarui kerangka data asli. Saya memasukkan "masalah" dalam tanda kutip karena ada alasan bagus untuk keputusan desain yang menyebabkan tidak menafsirkan melalui rantai ini dalam situasi tertentu. Juga, ini adalah contoh yang kompleks (meskipun saya benar-benar berlari ke dalamnya), tetapi hal yang sama dapat berlaku untuk tingkat indeks yang lebih sedikit tergantung pada bagaimana Anda mengiris.

Solusinya adalah DataFrame.update:

df.update(df.loc[idx[:,mask_1],idx[[mask_2],:]].fillna(value=0))

Ini satu baris, terbaca dengan cukup baik (semacam) dan menghilangkan segala macam yang tidak perlu dengan variabel menengah atau loop sambil memungkinkan Anda untuk menerapkan fillna ke setiap irisan multi-level yang Anda suka!

Jika ada yang bisa menemukan tempat ini tidak berfungsi, silakan posting di komentar, saya telah mengacaukannya dan melihat sumbernya dan tampaknya untuk menyelesaikan setidaknya masalah irisan multi-indeks saya.


21

Kode di bawah ini berfungsi untuk saya.

import pandas

df = pandas.read_csv('somefile.txt')

df = df.fillna(0)

7

Cara mudah untuk mengisi nilai yang hilang: -

mengisi kolom string: ketika kolom string memiliki nilai yang hilang dan nilai NaN.

df['string column name'].fillna(df['string column name'].mode().values[0], inplace = True)

mengisi kolom numerik: ketika kolom numerik memiliki nilai yang hilang dan nilai NaN.

df['numeric column name'].fillna(df['numeric column name'].mean(), inplace = True)

mengisi NaN dengan nol:

df['column name'].fillna(0, inplace = True)

5

Anda juga dapat menggunakan kamus untuk mengisi nilai NaN dari kolom tertentu dalam DataFrame alih-alih mengisi semua DF dengan beberapa nilai.

import pandas as pd

df = pd.read_excel('example.xlsx')
df.fillna( {
        'column1': 'Write your values here',
        'column2': 'Write your values here',
        'column3': 'Write your values here',
        'column4': 'Write your values here',
        .
        .
        .
        'column-n': 'Write your values here'} , inplace=True)

Ini adalah solusi yang ditujukan pengembang untuk pertanyaan OP.
johnDanger

4

masukkan deskripsi gambar di sini

Mempertimbangkan kolom tertentu Amountdalam tabel di atas adalah tipe integer. Berikut ini akan menjadi solusi:

df['Amount'] = df.Amount.fillna(0).astype(int)

Demikian pula, Anda dapat mengisinya dengan berbagai tipe data seperti float, strdan sebagainya.

Secara khusus, saya akan mempertimbangkan tipe data untuk membandingkan berbagai nilai dari kolom yang sama.


2

Untuk mengganti nilai na dalam panda

df['column_name'].fillna(value_to_be_replaced,inplace=True)

jika inplace = False, alih-alih memperbarui df (dataframe), itu akan mengembalikan nilai yang dimodifikasi.


1

Jika Anda mengonversinya menjadi bingkai data panda, Anda juga dapat melakukannya dengan menggunakan fillna.

import numpy as np
df=np.array([[1,2,3, np.nan]])

import pandas as pd
df=pd.DataFrame(df)
df.fillna(0)

Ini akan mengembalikan yang berikut:

     0    1    2   3
0  1.0  2.0  3.0 NaN
>>> df.fillna(0)
     0    1    2    3
0  1.0  2.0  3.0  0.0

1

Ada dua opsi yang tersedia terutama; dalam kasus imputasi atau pengisian nilai yang hilang NaN / np.nan dengan hanya penggantian numerik (di seluruh kolom:

df['Amount'].fillna(value=None, method= ,axis=1,) Cukup:

Dari Dokumentasi:

value: skalar, dict, Series, atau DataFrame Value yang digunakan untuk mengisi lubang (mis. 0), secara bergantian dict / Series / DataFrame dari nilai yang menentukan nilai yang akan digunakan untuk setiap indeks (untuk Seri) atau kolom (untuk DataFrame) . (nilai tidak dalam dikt / Seri / DataFrame tidak akan diisi). Nilai ini tidak boleh berupa daftar.

Yang berarti 'string' atau 'konstanta' tidak lagi diizinkan untuk diperhitungkan.

Untuk imputasi yang lebih khusus gunakan SimpleImputer () :

from sklearn.impute import SimpleImputer
si = SimpleImputer(strategy='constant', missing_values=np.nan, fill_value='Replacement_Value')
df[['Col-1', 'Col-2']] = si.fit_transform(X=df[['C-1', 'C-2']])

0

Untuk mengganti nan di kolom yang berbeda dengan cara berbeda:

   replacement= {'column_A': 0, 'column_B': -999, 'column_C': -99999}
   df.fillna(value=replacement)
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.