Skip to main content
 首页 » 编程设计

python之Pandas 与正则表达式 "."点元字符不一致

2024年10月01日34txw1958

考虑

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 

问题解决了。留下这个以防其他人对此感到困惑。