573

私は以下のようなパンダデータフレームを持っています:

      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

[金額]列に関数を適用しようとすると、次のエラーが発生します。

ValueError: cannot convert float NaN to integer

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

4

16 に答える 16

906

私は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

1つの列だけにNaNを入力するには、その列だけを選択します。この場合、実際にdfの内容を変更するためにinplace=Trueを使用しています。

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)
于 2012-11-08T18:54:27.467 に答える
166

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

df['column'] = df['column'].fillna(value)
于 2016-10-06T09:10:08.180 に答える
60

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)
于 2017-06-15T05:11:20.373 に答える
28

以下のコードは私のために働いた。

import pandas

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

df = df.fillna(0)
于 2016-09-13T20:59:31.637 に答える
27

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

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

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

解決策はDataFrame.updateです。

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

これは1行で、適度に読みやすく(一種の)、中間変数やループの不要な混乱を排除すると同時に、任意のマルチレベルスライスにfillnaを適用できます。

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

于 2015-06-02T05:13:34.193 に答える
11

ディクショナリを使用して、すべての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)
于 2019-07-16T20:02:37.390 に答える
9

不足している値を埋める簡単な方法:-

文字列列の入力 文字列列に欠落値と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)
于 2018-07-07T18:31:36.867 に答える
6

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

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

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

于 2019-03-29T19:46:45.553 に答える
5

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

上記の表の特定の列Amountを考慮すると、整数型です。以下が解決策になります:

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

同様に、などのさまざまなデータ型を入力できfloatますstr

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

于 2019-02-26T11:21:03.500 に答える
4

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

   replacement= {'column_A': 0, 'column_B': -999, 'column_C': -99999}
   df.fillna(value=replacement)
于 2020-03-24T23:38:37.450 に答える
4

すべてのnanを0に置き換えます

df = df.fillna(0)
于 2021-03-01T14:22:54.940 に答える
2

パンダのデータフレームに変換する場合は、を使用してこれを実行することもできます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
于 2019-05-15T18:20:57.580 に答える
2

主に利用可能な2つのオプションがあります。欠落値NaN/np.nanを数値置換のみで代入または埋める場合(列全体:

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

ドキュメントから:

値:スカラー、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']])

于 2019-07-23T13:36:14.570 に答える
2

これは私にとってはうまくいきますが、誰もそれについて言及していません。何か問題があるのでしょうか?

df.loc[df['column_name'].isnull(), 'column_name'] = 0
于 2021-03-31T03:24:29.867 に答える
1

特定の列のNaNを入力する場合は、locを使用できます。

d1 = {"Col1" : ['A', 'B', 'C'],
     "fruits": ['Avocado', 'Banana', 'NaN']}
d1= pd.DataFrame(d1)

output:

Col1    fruits
0   A   Avocado
1   B   Banana
2   C   NaN


d1.loc[ d1.Col1=='C', 'fruits' ] =  'Carrot'


output:

Col1    fruits
0   A   Avocado
1   B   Banana
2   C   Carrot
于 2020-11-07T19:03:05.147 に答える
1

すでに多くの貢献がありましたが、私はここが初めてなので、引き続き意見を述べます。

NaNPandas DataFrameで値をゼロに置き換えるには、次の2つの方法があります。

  1. fillna():関数は、指定されたメソッドを使用してNA/NaN値を入力します。
  2. replace():df.replace()文字列、正規表現、リスト、辞書を置き換えるために使用される単純なメソッド

例:

#NaN with zero on all columns
df2 = df.fillna(0)


#Using the inplace=True keyword in a pandas method changes the default behaviour.
    df.fillna(0, inplace = True)

# multiple columns appraoch
df[["Student", "ID"]] = df[["Student", "ID"]].fillna(0)

最後にreplace()メソッド:

df["Student"] = df["Student"].replace(np.nan, 0)
于 2022-01-11T06:59:25.553 に答える