熊猫数据框fillna()仅存在一些列


144

我试图只对某些列子集用0填充Pandas数据框中的任何值。

当我做:

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

它取代了每一个None0的。我想要做的是,只有更换NoneS IN列ab,但不会c

最好的方法是什么?

Answers:


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
我认为在您覆盖orig df的同时执行此操作不会带来任何性能提升
EdChum

4
该位置是多余的,df[['a', 'b']] = df[['a','b']].fillna(value=0)仍然可以使用
EdChum

2
@EdChum它不会产生临时数据帧,因此需要更多的内存吗?(我更关心的是内存,而不是时间的复杂性。)

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根据需要使用dict ,+ 1
U10转发

1
如果答案/示例实际上为不同的列显示了不同的值,则它将更加清晰。
RufusVS

@RufusVS是正确的,但仍然尝试匹配op的预期输出
YOBEN_S

1
这是公认的更好的解决方案,因为它避免了链接索引的问题,例如,如果与df.fillna({'a':0,'b':0}, inplace=True)
Alex

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

7

这是您可以在一行中完成所有操作的方法:

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

细分:df[['a', 'b']]选择要为其填充NaN值的列,value=0告诉它为NaN填充零,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']
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.