パンダデータフレームの列ですべてのNaN値をゼロに置き換えるにはどうすればよいですか


457

以下のようなデータフレームがあります

      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

Amount列に関数を.applyしようとすると、次のエラーが発生します。

ValueError: cannot convert float NaN to integer

数学モジュールの.isnanを使用して関数を適用しようとしました。パンダの.replace属性を試しました。パンダ0.9の.sparseデータ属性を試しました。関数でNaN == NaNステートメントの場合も試しました。この記事も見てきました。RデータフレームでNA値をゼロに置き換える方法を教えてください。他のいくつかの記事を見ながら。私が試した方法はすべて機能していないか、NaNを認識していません。ヒントや解決策をいただければ幸いです。


唯一の問題は、df.fill.na()が適用されているデータフレームがリサンプリングされているか、loc関数でスライスされている場合に機能しないことです
Prince Agarwal

回答:


754

私はDataFrame.fillna()あなたのためにこれを行うと信じています。

データフレームおよびシリーズのドキュメントへのリンク。

例:

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

NaNを1つの列のみに入力するには、その列だけを選択します。この場合、私はinplace = Trueを使用して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

編集:

を回避するSettingWithCopyWarningには、組み込みの列固有の機能を使用します。

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

1
df[1]元のDFのコピーではなく、ビューであることが保証されていますか?明らかに、それがコピーであるというまれな状況がある場合、それは非常に厄介なバグを引き起こすでしょう。パンダのドキュメントにそれについて明確な説明がありますか?
最大

これを参照してください@max、あなたの質問に対処するかもしれません:stackoverflow.com/questions/23296282/...
アマン

ありがとう。。?私の理解が正しいということの答えで「インデクサセットがあること、」割り当て直前に実行され、最も外側のインデックス操作(あるだけそうはあなたのコードの安全を作り、安全であることが保証され、単一のインデクサを使用していることを任意の割り当てである
最大

1
なぜこれがうまくいかないのですか?参照:stackoverflow.com/questions/39452095/how-to-fillna-with-value-0
displayname

1
最後の例は、SettingWithCopyWarning
Sip

124

スライスによってビューまたはコピーが返されることは保証されていません。できるよ

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

14
「inplace = True」の問題を発見しました。この答えは問題を回避し、私は提示された最もクリーンなソリューションだと思います。
TimCera 2017

48

あなたは使用することができますreplace変更するNaNには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)

置き換えるだけNaNですか?またはそれはまたどこNANaN好きな値を置き換えますdf.fillna(0)か?価値がある場合にのみ置き換えられるソリューションを探してNaNいますNA
Shyam Bhimani

1
@ShyamBhimaniは、NaNつまりnp.isnanTrueである値のみを置き換える必要があります
Anton Protopopov

23

人々がまだここに来ているように見えるので、更新/特別なケースを少し提供したかっただけです。マルチインデックスを使用している場合、またはインデックススライサーを使用している場合は、選択したスライスを更新するにはinplace = Trueオプションでは不十分な場合があります。たとえば、2x2レベルのマルチインデックスでは、これは値を変更しません(パンダ0.15以降)。

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

「問題」とは、チェーニングが元のデータフレームを更新する機能を壊すことです。特定の状況でこれらのチェーンを解釈しないようにした設計上の決定には十分な理由があるので、「問題」を引用符で囲みました。また、これは複雑な例です(私は実際にそれに遭遇しましたが)。スライスする方法によっては、同じことがより少ないレベルのインデックスに適用される場合があります。

ソリューションはDataFrame.updateです。

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

それは1行で、ある程度読みやすく(ある程度)、中間変数やループによる不要な混乱を排除しながら、好きなマルチレベルスライスにフィルナを適用できます!

これが機能しない場所を誰かが見つけた場合は、コメントに投稿してください。私はそれをいじってソースを調べてきましたが、少なくとも私のマルチインデックススライスの問題は解決しているようです。


21

以下のコードは私のために働きました。

import pandas

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

df = df.fillna(0)

7

欠損値を埋める簡単な方法:-

文字列列を埋める文字列列に欠損値とNaN値がある場合。

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

充填 数値列を:数値列は、欠損値とNaN値を持っている場合。

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

NaNをゼロで埋める:

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

5

辞書を使用して、すべてのDFをoneValueで埋めるのではなく、DataFrameの特定の列のNaN値を埋めることもできます。

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)

これは、OPの質問に対する開発者向けのソリューションです。
johnDanger

4

ここに画像の説明を入力してください

Amount上記の表の特定の列が整数型であることを考慮してください。以下は解決策です:

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

同様に、次のようなさまざまなデータ型とそれを埋めることができfloatstrというように。

特に、同じ列のさまざまな値を比較するためにデータ型を検討します。


2

パンダのna値を置き換えるには

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

の場合inplace = False、df(データフレーム)を更新する代わりに、変更された値を返します。


1

パンダデータフレームに変換する場合は、を使用してこれを実行することもできますfillna

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

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

これは以下を返します:

     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

主に2つのオプションが利用可能です。代入または欠損値の入力の場合NaN / np.nan(列全体:

df['Amount'].fillna(value=None, method= ,axis=1,) 十分なものです:

ドキュメントから:

value:穴を埋めるために使用するスカラー、dict、Series、またはDataFrame値(例:0)、または各インデックス(Seriesの場合)または列(DataFrameの場合)に使用する値を指定する値のdict / Series / DataFrame 。(dict / Series / DataFrameにない値は入力されません)。この値をリストにすることはできません。

つまり、「文字列」または「定数」が代入されることはもはや許可されません。

より特殊な補完については、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

異なる列のnanを異なる方法で置き換えるには:

   replacement= {'column_A': 0, 'column_B': -999, 'column_C': -99999}
   df.fillna(value=replacement)
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.