Python 通过使用regex将值替换为np.nan

Python 通过使用regex将值替换为np.nan,python,pandas,Python,Pandas,我有一个数据帧,如下所示: 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

我有一个数据帧,如下所示:

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.nan
熊猫的文件有什么解释吗?我可以通过网站找到一些信息

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

,当用“缺失”替换字符串的一部分时,这只能意味着整个条目被破坏。我听说过这个叫做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应该总是污染所有数据。熊猫采取了更务实的方法

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

在python中有和

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

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

请注意,Python没有努力区分信令nan和 安静的NAN,信号NAN的行为仍不明确。 典型的行为是把所有的南人都当作安静的人对待


你想要的结果是什么?@ShiheZhang没有渴望的结果,为什么replace+regex会有这种行为,我找不到任何与此相关的文档,唯一的办法就是通读源代码。你使用的是什么版本的
pandas
?这实际上发生在任何非字符串对象上,据我所知,请尝试将其传递给
对象()
@juanpa.arrivillaga my pandas pd.\uuu版本\uuuuuuu Out[692]:'0.20.3',您将需要使用
作为索引,在df.iterrows()中的行:
来循环通过df,并使用类似于'if(s.contains(“0”)`的东西来检查它是否存在。然后更新整个值,而不是字符,就像我用R
sum(,na.rm=T)所做的那样。对于我来说,我只是不知道为什么它们不返回任何错误,只需将整个字符串替换为
np.nan
,至少应该正确地返回一些警告…因为在python中,这是正确的结果,不需要提出警告。
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