在Pandas中用0替换空格(Python 3)

3

这里有一个简单的问题——如何用零替换列中的所有空格?

例如:

  Name       Age
  John       12
  Mary 
  Tim        15

转化为

  Name       Age
  John       12
  Mary       0
  Tim        15

我一直在尝试使用类似这样的方式,但我不确定Pandas到底如何读取空格:

 merged['Age'].replace(" ", 0).bfill()

有什么想法吗?
4个回答

4
merged['Age'] = merged['Age'].apply(lambda x: 0 if x == ' ' else x)

3

使用内置方法convert_objects并设置参数convert_numeric=True

In [12]:
# convert objects will handle multiple whitespace, this will convert them to NaN
# we then call fillna to convert those to 0
df.Age = df[['Age']].convert_objects(convert_numeric=True).fillna(0)
df
Out[12]:
   Name  Age
0  John   12
1  Mary    0
2   Tim   15

这有点超出了OP的要求范围,因为它会清除他可能拥有的任何非数字数据,而不仅仅是空格。 - Patrick Collins
@PatrickCollins 原始问题中没有提到需要处理的其他情况,除非这种方法无法满足OP的特定数据要求,否则这是推荐的方法。 - EdChum
感谢Patrick提供的提示,但在这种情况下,我没有任何非数字数据,所以Ed的解决方案完美地解决了问题。谢谢(你们都收到了点赞!) - user3682157
1
df.convert_objects() 已自 v0.21.0 起被弃用。现在的首选解决方案是 df.Age = pd.to_numeric(df['Age']).fillna(0)。 - David Bridgeland

1

这是一份修改过的答案,源自于一个更加深入的问题。我会让它更符合Python规范,同时解决你的basestring问题。

def ws_to_zero(maybe_ws):
    try:
        if maybe_ws.isspace():
            return 0
        else:
            return maybe_ws
    except AttributeError:
        return maybe_ws

d.applymap(ws_to_zero)

其中 d 是您的数据框。


嗨,Patrick,我在研究时尝试过这个 -- 我收到了一个错误,提示basestring未被识别! - user3682157
@user3682157 你使用的是哪个版本的Python? - Patrick Collins
我正在使用Python 3.4。 - user3682157
问题在于basestring在py3k中已经被合并为str。您可以通过将str替换为basestring来解决它。但是,我发布的解决方案更接近Python处理此类问题的首选方式。 - Patrick Collins

0
如果你想使用NumPy,那么你可以使用下面的代码片段:
import numpy as np    
df['column_of_interest'] = np.where(df['column_of_interest']==' ',0,df['column_of_interest']).astype(float)

虽然 Paulo 的回答非常出色,但是我的代码片段可能在高级数据操作期间需要多个条件时很有用。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接