意外的pandas.Series.replace()行为

3
鉴于此 -
导入Pandas库:import pandas as pd 创建Series对象并将字符串放入其中:s = pd.Series(['', '1', '2', '', '4', '', '6']) 为什么这个操作 -
用None替换Series中的空字符串,并返回结果:s.replace('', None).values 会得到这个结果 - array(['', '1', '2', '2', '4', '4', '6'], dtype=object) 当我们本来期望的是下面这种结果 - array([None, '1', '2', None, '4', None, '6'], dtype=object) 请注意,HTML标记应保留而不必解释。

现在可以使用s.replace([''],[None]).values,这与您想要的相同。 - Nickil Maveli
1个回答

6
在这里使用None是有问题的。如果你将None作为参数传递,它将使用默认值(docs):
None是types.NoneType唯一的值。None经常用于表示值的缺失,例如在未传递默认参数到一个函数时。
因此,s.replace('', None)s.replace('')相同。明显,当没有传递值时的默认操作是向前填充系列。相反,你可以使用np.nan:
pd.Series(['', '1', '2', '', '4', '', '6']).replace('', np.nan)
Out: 
0    NaN
1      1
2      2
3    NaN
4      4
5    NaN
6      6
dtype: object

或者传递一个字典:

s.replace({'': None})
Out: 
0    None
1       1
2       2
3    None
4       4
5    None
6       6
dtype: object

1
这种行为非常令人困惑(而且危险)。 库应该使用标记对象来表示默认值,例如replace(...,value = MISSING_TOKEN),并允许值为None。 - user48956

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接