Fillna在Python Pandas中的多个列中

ozz*_*zzy 24 python dataframe pandas

我有一个混合类型的pandas dataFrame,有些是字符串,有些是数字.我想用'.'替换字符串列中的NAN值,并将浮点列中的NAN值替换为0.

考虑这个小小的虚构示例:

df = pd.DataFrame({'Name':['Jack','Sue',pd.np.nan,'Bob','Alice','John'],
    'A': [1, 2.1, pd.np.nan, 4.7, 5.6, 6.8],
    'B': [.25, pd.np.nan, pd.np.nan, 4, 12.2, 14.4],
    'City':['Seattle','SF','LA','OC',pd.np.nan,pd.np.nan]})
Run Code Online (Sandbox Code Playgroud)

现在,我可以用3行代码完成:

df['Name'].fillna('.',inplace=True)
df['City'].fillna('.',inplace=True)
df.fillna(0,inplace=True)
Run Code Online (Sandbox Code Playgroud)

由于这是一个小数据帧,3行可能没问题.在我的实际例子中(由于数据机密性原因,我不能在这里分享),我有更多的字符串列和数字列.所以我最终只为fillna写了很多行.这样做有简洁的方法吗?

Ant*_*pov 22

您可以通过检查以下内容来apply检查dtype是否使用列:numericdtype.kind

res = df.apply(lambda x: x.fillna(0) if x.dtype.kind in 'biufc' else x.fillna('.'))

print(res)
     A      B     City   Name
0  1.0   0.25  Seattle   Jack
1  2.1   0.00       SF    Sue
2  0.0   0.00       LA      .
3  4.7   4.00       OC    Bob
4  5.6  12.20        .  Alice
5  6.8  14.40        .   John
Run Code Online (Sandbox Code Playgroud)

  • 十分优雅!你能确认 `'biufc'` 适用于布尔、整数、unicode、浮点数和复杂数据类型吗? (4认同)

Bob*_*ley 12

您可以手动列出字符串列,也可以从中收集字符串列df.dtypes.获得字符串/对象列的列表后,可以一次调用fillna所有这些列.

# str_cols = ['Name','City']
str_cols = df.columns[df.dtypes==object]
df[str_cols] = df[str_cols].fillna('.')
df.fillna(0,inplace=True)
Run Code Online (Sandbox Code Playgroud)


Rob*_*ahn 9

在寻找这个问题的答案时遇到了这个页面,但是不喜欢现有的答案.我最终在DataFrame.fillna文档中找到了更好的东西,并且认为我会为其他任何事情做出贡献.

如果您有多个列,但只想替换NaN它们的子集,则可以使用:

df.fillna({'Name':'.', 'City':'.'}, inplace=True)
Run Code Online (Sandbox Code Playgroud)

这也允许您为每列指定不同的替换.如果你想继续填写所有剩余的NaN值,你可以fillna在最后抛出另一个:

df.fillna({'Name':'.', 'City':'.'}, inplace=True).fillna(0, inplace=True)
Run Code Online (Sandbox Code Playgroud)