Pandas数据框架fillna()只有一些列到位

我试图填补一个熊猫数据框架与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。我想做的是,只替换ab列中的__abc0,而不是c

做这件事最好的方法是什么?

345815 次浏览

你可以选择你想要的列,并通过赋值来完成:

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

你可以对不同的列使用不同值的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

你可以使用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

或者像这样:

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

以下是如何在一行中做到这一点:

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

分解:df[['a', 'b']]选择你想要填充NaN值的列,value=0告诉它将NaN填充为零,而inplace=True将使这些更改永久存在,而不必对对象进行复制。

使用顶部答案将产生关于更改df片副本的警告。假设您有其他列,更好的方法是传递一个字典:
df.fillna({'A': 'NA', 'B': 'NA'}, inplace=True) < / p >

有时候这个语法不起作用:

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

请使用以下语句:

df['col1','col2']

由于一些奇怪的原因,这个没有工作(使用Pandas: '0.25.1')

df[['col1', 'col2']].fillna(value=0, inplace=True)

另一个解决方案:

subset_cols = ['col1','col2']
[df[col].fillna(0, inplace=True) for col in subset_cols]

例子:

df = pd.DataFrame(data={'col1':[1,2,np.nan,], 'col2':[1,np.nan,3], 'col3':[np.nan,2,3]})

输出:

   col1  col2  col3
0  1.00  1.00   nan
1  2.00   nan  2.00
2   nan  3.00  3.00

将列表comp.应用于fillna值:

subset_cols = ['col1','col2']
[df[col].fillna(0, inplace=True) for col in subset_cols]

输出:

   col1  col2  col3
0  1.00  1.00   nan
1  2.00  0.00  2.00
2  0.00  3.00  3.00

这应该工作,没有copywarning

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