考虑
df
Cost
Store 1 22.5
Store 1 .........
Store 2 ...
要将这些点转换为 nan,我可以使用:
df.replace('^\.+$', np.nan, regex=True)
Cost
Store 1 22.5
Store 1 NaN
Store 2 NaN
我不明白为什么以下模式也有效:
df.replace('^.+$', np.nan, regex=True)
Cost
Store 1 22.5
Store 1 NaN
Store 2 NaN
请注意,在这种情况下,我没有对 . 进行转义,因此它应该被视为一个 matchall 字符,导致每一行都被转换为 NaN...但它不是't.... 只有 .... 行匹配...即使我使用了 matchall 字符。
对比一下:
import re
re.sub('^.+$', '', '22.5')
''
返回一个空字符串。
这是怎么回事?
请您参考如下方法:
这道题写到一半,才意识到问题出在哪里:
df.Cost.dtype
dtype('O')
df.Cost.values
array([22.5, '.........', '...'], dtype=object)
因此,22.5 恰好是一个数值,正则表达式模式在尝试替换时只是跳过 非字符串值。进行 astype 转换使其显而易见:
df.astype(str).replace('.+', np.nan, regex=True)
Cost
Store 1 NaN
Store 1 NaN
Store 2 NaN
问题解决了。留下这个以防其他人对此感到困惑。
