【问题标题】:replace value by using regex to np.nan使用正则表达式替换值到 np.nan
【发布时间】:2017-10-26 10:55:03
【问题描述】:

我有一个如下的数据框:

data1 = {"first":["alice", "bob", "carol"],
         "last_huge":["foo", "bar", "baz"]}
df = pd.DataFrame(data1)

例如,我想将所有字符 'o' 替换为 'a':

那我做

df.replace({"o":"a"},regex=True)
Out[668]: 
   first last
0  alice  faa
1    bab  bar
2  caral  baz

它回馈我需要的东西。

然而,当我想将 'o' 替换为 np.nan 时,它会将整个字符串更改为 np.nanpandas的文档有解释吗?我可以通过source code找到一些资料。

更多信息:(它将整个字符串更改为np.nan

df.replace({"o":np.nan},regex=True)
Out[669]: 
   first last
0  alice  NaN
1    NaN  bar
2    NaN  baz

【问题讨论】:

  • 你想要什么结果?
  • @ShiheZhang 没有想要的结果,为什么替换+正则表达式有这种行为,我找不到与此相关的任何文档,唯一的方法是通过源代码阅读。
  • 您使用的是哪个版本的pandas?这实际上发生在任何非字符串对象上,据我所知,尝试传递它object()
  • @juanpa.arrivillaga my pandas pd.__version__ Out[692]: '0.20.3'
  • 您将需要使用for index, row in df.iterrows(): 循环遍历 df 和类似`if(s.contains("0"))` 来检查它是否存在。然后更新整个值而不是字符

标签: python pandas


【解决方案1】:

NaN is consistently used as a placeholder for missing,当用“缺失”替换字符串的一部分时,它只能意味着整个条目被破坏。我听说这称为 NaN 污染(或类似的,会看看我是否能找到一些参考资料),因为如果 NaN 接触,数据就会受到损害。

也就是说,情况并非总是如此:

In [11]: s = pd.Series([1, 2, np.nan, 4])

In [12]: s.sum()
Out[12]: 7.0

In [13]: s.sum(skipna=False)
Out[13]: nan

在某些语言中,您会看到 skipna=False 作为默认行为,有些人强烈认为 NaN 应该总是污染所有数据。 Pandas 采取了更加务实的方法...

真正的问题是你希望它在 NaN 的情况下做什么?

【讨论】:

  • 就像我对 R 所做的那样 sum(.,na.rm=T)
  • 对我来说,我只是不知道他们为什么不返回任何错误,只需将整个字符串替换为np.nan,至少应该返回一些警告吧...
  • 因为在python中,这是正确的结果,不需要发出警告。
【解决方案2】:

在python中有cmath.nanmath.nan

CPython 实现细节:数学模块主要由围绕平台 C 数学库函数的薄包装器组成。特殊情况下的行为在适当的情况下遵循 C99 标准的附件 F。当前实现将针对无效操作引发 ValueError,例如 sqrt(-1.0) 或 log(0.0)(其中 C99 Annex F 建议发出无效操作或被零除),并针对溢出的结果引发 OverflowError(例如,exp(1000.0 ))。上述任何函数都不会返回 NaN,除非有一个 或更多输入参数是 NaN;在这种情况下,大多数功能 将返回一个 NaN,但是(再次遵循 C99 附件 F)有一些 此规则的例外情况,例如 pow(float('nan'), 0.0) 或 假设(浮动('nan'),浮动('inf'))。

简而言之,当您的输入参数有 NaN 时,它将返回 NaN

And also:

请注意,Python 不会努力区分信号 NaN 和 安静的 NaN,并且信号 NaN 的行为仍未指定。 典型的行为是将所有 NaN 视为安静。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-03-29
    • 2022-01-01
    • 1970-01-01
    • 2019-01-24
    • 1970-01-01
    • 1970-01-01
    • 2014-04-30
    相关资源
    最近更新 更多