问答中心分类: PYTHONPandas dataframe fillna()只有部分列就位
0
匿名用户 提问 1小时 前

我试图在Pandas数据帧中用0填充none值,仅用于部分列的子集。
当我这样做时:

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我想做的是,只替换None列中的ab,但不是c.
最好的方法是什么?

8 Answers
0
BENY 回答 1小时 前

您可以使用dict,fillna不同列的值不同

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
U12-Forward 回复 1小时 前

真的很酷,顺便说一句,你可以用这个dictfromkeys如果需要,+1

RufusVS 回复 1小时 前

如果它实际为不同的列显示了不同的值,那么答案/示例会更清楚。

BENY 回复 1小时 前

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

Alex 回复 1小时 前

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

shaik moeed 回复 1小时 前

如何使用以下方法ffillbfill在字典里?

0
Leesa H. 回答 1小时 前

您可以避免使用温的解决方案复制对象,并且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
jpp 回复 1小时 前

虽然这是正确的,但避免复制不一定更好.

0
Jonathan 回答 1小时 前

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

0
Joshua Z 回答 1小时 前

这应该可以正常工作,并且没有复制警告

df[['a', 'b']] = df.loc[:,['a', 'b']].fillna(value=0)
0
Josephine M. Ho 回答 1小时 前

以下是如何在一行中完成这一切:

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

细分:df[['a', 'b']]选择要填充NaN值的列,value=0告诉它用零填充NaNs,然后inplace=True将使更改永久化,而不必复制对象。

Michael 回复 1小时 前

不知怎的,这给了SettingWithCopyWarning,而变化并没有反映在df.