熊猫与正则表达式不一致“。”点元字符?

时间:2017-11-06 08:23:12

标签: python regex pandas

考虑

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') 
''

返回一个空字符串。

那是怎么回事?

1 个答案:

答案 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

问题解决了。如果其他人对此感到困惑,请留下这个。