Pandas - 如何在DataFrame系列中用零值替换字符串?

5
我正在将一些csv数据导入到Pandas DataFrame(在Python中)。其中一个系列应该是所有数字值。但是,它还包含一些被表示为字符串的虚假"$ -"元素。这些元素是从以前的格式留下来的。如果我只是导入该系列,Pandas会报告它是一个'object'系列。
最好的方法是用零替换这些"$ -"字符串吗?或者更一般地说,如何用数字值替换系列中的所有字符串(主要是数字),并将系列转换为浮点类型?
  • 史蒂夫

我已重新发布了一个更一般的问题,关于如何处理会计格式数据。请参见这里[将Pandas Series从会计格式转换为数字格式?] (http://goo.gl/ol1Fnl) - Steve Maughan
3个回答

11
你可以使用DataFrameconvert_objects方法,并设置convert_numeric=True,将字符串转换为NaNs
来自文档:

convert_numeric: 如果为True,则尝试强制转换为数字(包括字符串),无法转换的值将变为NaN。

In [17]: df
Out[17]: 
    a   b  c
0  1.  2.  4
1  sd  2.  4
2  1.  fg  5

In [18]: df2 = df.convert_objects(convert_numeric=True)

In [19]: df2
Out[19]: 
    a   b  c
0   1   2  4
1 NaN   2  4
2   1 NaN  5

最后,如果你想将那些 NaN 转换为 0,你可以使用 df.replace

In [20]: df2.replace('NaN',0)
Out[20]: 
   a  b  c
0  1  2  4
1  0  2  4
2  1  0  5

7
请注意,pd.to_numeric 是最新的热门方法;convert_objects 已被废弃。 - DSM
啊,谢谢。我还没有升级到0.17,所以这个选项不在我的pandas里。我会更新我的答案... - tmdavison
@DSM看起来只适用于1D对象,因此转换“DataFrame”更为复杂...或者我漏掉了什么? - tmdavison
谢谢 - 但看起来我的数据有点混乱。它适用于一个系列,但不适用于另一个系列。导致问题的系列包含 "$-""($24)" 值。在进行 pd.to_numeric 后,它仍然显示为对象类型。 - Steve Maughan

4
使用.to_numeric将字符串转换为数字 (使用错误选项 'coerce' 将字符串设置为NaN):
df = pd.to_numeric(df, errors='coerce')

然后使用replace函数将NaN值替换为0:

df.replace('NaN',0)

3
使用 Series.str.replaceSeries.astype 函数。
df = pd.Series(['2$-32$-4','123$-12','00123','44'])
df.str.replace(r'\$-','0').astype(float)

0    203204
1    123012
2       123
3        44
dtype: float64

谢谢 - 这个几乎可以工作,但是 "($24)" 的值会出现问题。 - Steve Maughan
如果您想只保留数字,可以使用 df.str.replace(r'[^0-9]+','') - hellpanderr
谢谢 - 但是如何将括号解析为负数,例如 "$(24)" 转换为 -24 - Steve Maughan
1
你的意思是有单独的减号吗?你能贴一下你数据的例子吗? - hellpanderr
嗨@hellpanderrr,我在这里发布了一个更一般的问题:http://stackoverflow.com/questions/33456364/convert-a-pandas-series-in-accounting-format-to-a-numeric-series,其中有一个解决方案 - 谢谢! - Steve Maughan

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