【问题标题】:Pandas - How to replace string with zero values in a DataFrame series?Pandas - 如何在 DataFrame 系列中用零值替换字符串?
【发布时间】:2015-10-30 16:04:24
【问题描述】:

我正在将一些 csv 数据导入 Pandas DataFrame(在 Python 中)。一个系列意味着所有的数值。但是,它也包含一些以字符串表示的虚假“$-”元素。这些是以前的格式遗留下来的。如果我只是导入该系列,Pandas 会将其报告为一系列“对象”。

用零替换这些“$-”字符串的最佳方法是什么?或者更一般地说,如何用数值替换系列中的所有字符串(主要是数字),并将系列转换为浮点类型?

  • 史蒂夫

【问题讨论】:

标签: python pandas dataframe


【解决方案1】:

使用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)" 值上绊倒。
  • 如果你只想留下数字,你可以使用df.str.replace(r'[^0-9]+','')
  • 谢谢 - 但是如何将括号解析为负数,即 "$(24)"-24
  • 你的意思是可以有单独的缺点吗?您可以发布您的数据示例吗?
  • 嗨@hellpanderrr 我在这里发布了一个更一般的问题:stackoverflow.com/questions/33456364/… 有一个解决方案 - 谢谢!
【解决方案2】:

可以使用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

最后,如果你想把那些NaNs转换成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

【讨论】:

  • 注意pd.to_numeric是新的热点; convert_objects 已被弃用。
  • 啊,谢谢。我还没有升级到0.17,所以这个选项不在我的pandas 中。我会更新我的答案...
  • @DSM 似乎只适用于 1D 对象,因此转换 DataFrame 更复杂......还是我错过了什么?
  • 谢谢 - 但看起来我的数据有点被污染了。它适用于一个系列,但不适用于另一个系列。绊倒它的系列包含"$-""($24)" 值。在pd.to_numeric 之后,它仍然显示为对象类型
【解决方案3】:

使用.to_numeric 将字符串转换为数字(使用错误选项“强制”将字符串设置为NaN):

df = pd.to_numeric(df, errors='coerce')

然后使用替换将NaN 值转换为零:

df.replace('NaN',0)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-11-09
    • 2022-11-25
    • 2020-04-02
    • 2019-07-25
    • 1970-01-01
    • 2019-12-07
    • 2021-10-19
    • 2023-01-24
    相关资源
    最近更新 更多