Pandas dataframe fillna()一部の列のみが配置されている


144

列の一部のサブセットについてのみ、Pandasデータフレームの値を0で埋めようとしています。

私がする時:

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

出力:

     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

すべてNoneをに置き換え0ます。私がやりたいのは、Noneaとのs のみを置き換え、は置き換えbないことcです。

これを行う最良の方法は何ですか?

回答:


218

目的の列を選択して、割り当てによってそれを行うことができます。

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

結果の出力は期待どおりです。

     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

はい、これがまさに私が欲しいものです!ありがとうございました。これを行う方法はありますか?私の元のデータフレームはかなり大きいです。
2016年

1
とにかく元のdfを上書きしているので、これを適切に実行してもパフォーマンスは向上しないと思います
EdChum

4
場所はここでdf[['a', 'b']] = df[['a','b']].fillna(value=0)
不要

2
@EdChum一時的なデータフレームを生成するので、そのためにはより多くのメモリが必要ですか?(時間の複雑さよりもメモリの方が気になります。)
2016年

7
多くの操作で、inplace引き続きコピーで機能します。それが本当かどうかわからfillnaない。パンダのコア開発者の一人からのこの回答を見てください。
ルート

85

列ごとに異なる値を使用してdictfillna

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

割り当て後

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
本当にかっこいい、fromkeysあなたが望むなら使うことができる口述のBtw 、+ 1
U10-Forward

1
答え/例は、実際に列ごとに異なる値が表示されていれば、より明確になります。
RufusVS 2018

@RufusVS正しいですが、それでも操作の予想出力と一致するようにしてください
YOBEN_S

1
これは、例えばチェーンインデックスの問題を回避するために使用された場合、受け入れ答えより良いソリューションですdf.fillna({'a':0,'b':0}, inplace=True)
アレックス・

19

Wenのソリューションとinplace = Trueを使用してオブジェクトのコピーを作成することを回避できます。

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

収量:

     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
これは正しいことですが、コピーを回避することは必ずしも良いとは限りません
jpp 2018年

7

すべてを1行で行う方法は次のとおりです。

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

内訳:df[['a', 'b']]NaN値を入力する列を選択し、value=0NaNをゼロで入力するように指示しinplace=True、オブジェクトのコピーを作成することなく、変更を永続的にします。


7

上の回答を使用すると、dfスライスのコピーに変更を加えることについて警告が表示されます。他の列があると仮定すると、これを行うより良い方法は、辞書を渡すことです:
df.fillna({'A': 'NA', 'B': 'NA'}, inplace=True)


3

または次のようなもの:

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

さらにある場合:

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

0

時々この構文はうまくいきません:

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

代わりに以下を使用してください。

df['col1','col2']
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.