没有匹配项时更换熊猫正则表达式

时间:2019-12-14 08:46:43

标签: regex pandas

我正在使用pandas.Series.str.replace从字符串中提取数字(它的数据已从@WPWeather抓取),我已经将所有字段都提取到了这样的DataFrame中。 ..

 df.head()
Out[48]: 
                              temp   pressure relative_humidity  \
created_at                                                        
2019-12-13 10:19:13  5.2\xc2\xbaC,   975.4mb,            91.3%.   
2019-12-12 10:19:07    2\xc2\xbaC,   990.3mb,            96.9%.   
2019-12-11 10:19:07  4.2\xc2\xbaC,  1000.8mb,            85.7%.   
2019-12-10 10:19:00  6.3\xc2\xbaC,  1008.5mb,            94.4%.   
2019-12-09 10:18:51  5.4\xc2\xbaC,  1006.7mb,            68.5%.   

                    last_24_max_temp last_24_min_temp      rain sunshine  
created_at                                                                
2019-12-13 10:19:13      7\xc2\xbaC,      2\xc2\xbaC,    9.5mm,        0  
2019-12-12 10:19:07      6\xc2\xbaC,    1.5\xc2\xbaC,   0.9mm.'      NaN  
2019-12-11 10:19:07   11.7\xc2\xbaC,    2.2\xc2\xbaC,  14.1mm.'      NaN  
2019-12-10 10:19:00    6.5\xc2\xbaC,    1.9\xc2\xbaC,   1.1mm.'      NaN  
2019-12-09 10:18:51    8.5\xc2\xbaC,    5.2\xc2\xbaC,    1.5mm,      1.9  

我正在尝试使用正则表达式使用...提取数值。

pd.to_numeric(df['temp'].str.replace(r'(^-?\d+(?:\.\d+)?)(.*)', r'\1', regex=True))

...并且效果很好,但是我遇到了一个实例,其中一个温度场没有值,只是\xc2\xbaC,,因此在第一个分组中没有匹配项在r'\1'中使用,当尝试转换为数字时,失败并显示...

pandas/_libs/lib.pyx in pandas._libs.lib.maybe_convert_numeric()

ValueError: Unable to parse string "\xc2\xbaC," at position 120

我如何用理智的东西(例如,空白)替换不匹配项,以便在我调用pd.to_numeric()时将其转换为NaN

1 个答案:

答案 0 :(得分:1)

最初的想法是更改字符串以进行替换,然后获取不存在的值获取缺失的值:

df['temp'] = pd.to_numeric(df['temp'].str.replace(r'\xc2\xbaC,', '', regex=True))
print (df)
                     temp   pressure relative_humidity
created_at                                            
2019-12-13 10:19:13   5.2   975.4mb,            91.3%.
2019-12-12 10:19:07   2.0   990.3mb,            96.9%.
2019-12-11 10:19:07   4.2  1000.8mb,            85.7%.
2019-12-10 10:19:00   6.3  1008.5mb,            94.4%.
2019-12-09 10:18:51   5.4  1006.7mb,            68.5%.

您应使用to_numeric中的参数errors='coerce'更改您的解决方案,以将非数字替换为缺失值:

df['temp'] = (pd.to_numeric(df['temp'].str.replace(r'(^-?\d+(?:\.\d+)?)(.*)',r'\1',regex=True),
                            errors='coerce'))