【问题标题】:Pandas.DataFrame.str.replace function replaces floats to NaNPandas.DataFrame.str.replace 函数将浮点数替换为 NaN
【发布时间】:2017-08-28 11:38:51
【问题描述】:

我有一个 Pandas DataFrame,假设: df = pd.DataFrame({'Column name':['0,5',600,700]})

我需要删除,。代码是: df_mod = df.stack().str.replace(',','').unstack()

结果我得到:[05, NaN, NaN]

你有什么想法为什么我的表达式用 NaN 替换数字以及如何避免它?非常感谢!

【问题讨论】:

  • 您混合了 dtype,所以我认为替换导致 dtype 上转换为浮动

标签: python-3.x pandas dataframe


【解决方案1】:

那些数字被视为数值,没有str.replace方法,你可以将列转换为字符串,去掉逗号,然后将数据类型转换回来:

df['Column name'].astype(str).str.replace(",", "").astype(int)

#0      5
#1    600
#2    700
#Name: Column name, dtype: int64

【讨论】:

  • 这是 pandas 的奇怪和不一致的行为,没有错误没有警告
  • 这个解决方案有一些问题。 1.如果列包含混合数字和str,最后一个astype会失败。 2. 如果存在 NaN,我认为 astype(int) 会失败。将其切换为 astype(float)? 3. 如果跳过最后一个astype,那么NaN会被保存为字符串
【解决方案2】:

我有一个替代答案,只是为了好玩:

df.applymap(lambda x: x.replace(',','') if type(x) is str else x)

这将检查 str 类型的每个值,然后检查任何 str 的 .replace。

【讨论】:

  • 尝试使用这个变体,它似乎什么也没做)我们需要以某种方式运行 x 的迭代
  • 您帖子中的示例 df 可以正常工作。你的 df 有什么不同吗?
  • 对不起,我错了,它工作得很好。由于某种原因,在 PyCharm 的调试模式下执行需要花费太多时间 - 我认为它根本不起作用)
  • 我已经尝试为您的示例 df:1000 个循环计时,最好的 3 个:每个循环 517 µs。这段代码你不应该面临太多的性能问题..):
  • 是的,在运行模式下它执行得非常快。我会用它
【解决方案3】:

正如@Psidom 所确定的,您会得到NaN,因为ints 没有replace 方法。您可以按原样运行它并使用原始列填充那些Nan 值

c = 'Column name'
df[c].str.replace(',', '').fillna(df[c])

0     05
1    600
2    700
Name: Column name, dtype: object

这会保留所有dtypes

【讨论】:

  • 我有一个 df['xxx'].str.replace('.0', '') 似乎截断了除最后两个字符串之外的所有内容。有人知道为什么吗?
猜你喜欢
  • 2019-05-10
  • 2012-03-09
  • 2014-01-21
  • 2021-11-16
  • 2018-04-30
  • 2012-05-09
  • 2021-12-18
  • 2020-08-14
  • 1970-01-01
相关资源
最近更新 更多