考虑
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 ......但事实并非如此。 ...只有....
行匹配... 即使我使用了matchall字符。
与此对比:
import re
re.sub('^.+$', '', '22.5')
''
返回一个空字符串。
那是怎么回事?
答案 0 :(得分:2)
写这个问题的中途,我意识到问题是什么:
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
问题解决了。如果其他人对此感到困惑,请留下这个。