pandas将NaN替换为None表现出违反直觉的行为

cs9*_*s95 14 python replace pandas

鉴于一系列

s = pd.Series([1.1, 1.2, np.nan])
s
0    1.1
1    1.2
2    NaN
dtype: float64
Run Code Online (Sandbox Code Playgroud)

如果需要将NaN转换为无(例如,与parquets一起工作),那么我希望有

0     1.1
1     1.2
2    None
dtype: object
Run Code Online (Sandbox Code Playgroud)

我认为Series.replace这将是显而易见的方式,但这是函数返回的内容:

s.replace(np.nan, None)

0    1.1
1    1.2
2    1.2
dtype: float64
Run Code Online (Sandbox Code Playgroud)

NaN向前填充,而不是被替换.通过文档,我看到如果第二个参数是None,那么第一个参数应该是字典.基于此,我希望replace要么按预期替换,要么抛出异常.

我相信这里的解决方法是

pd.Series([x if pd.notna(x) else None for x in s], dtype=object) 
0     1.1
1     1.2
2    None
dtype: object
Run Code Online (Sandbox Code Playgroud)

哪个好.但我想了解为什么会出现这种情况,是否记录在案,或者它只是一个错误而且我必须清除我的git配置文件并在问题跟踪器上记录一个...任何想法?

Dan*_*ejo 6

这是行为在method参数的文档中:

method : {‘pad’, ‘ffill’, ‘bfill’, None}

The method to use when for replacement, when to_replace is a scalar, list or tuple and value is None.
Run Code Online (Sandbox Code Playgroud)

所以在你的例子中to_replace是一个标量,而且valueNone.默认情况下pad,该方法来自fillna的文档:

pad / ffill: propagate last valid observation forward to next valid
Run Code Online (Sandbox Code Playgroud)

  • 好吧,这表明`s.replace(np.nan,None,method = None)`会起作用但它没有和borks (3认同)
  • @ayhan啊好吧,对我来说这很奇怪,它可能不会被改变,因为它有记录,但它对我来说意外,我不会指望这种行为,通常没有任何反应或完全匹配的值被替换,我不会使用因此,将`replace`改为`ffill`或`bfill` (2认同)