首页 > 解决方案 > 没有匹配项时的 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

标签: regexpandas

解决方案


Onde 的想法是更改字符串以进行替换,然后得到不存在的值得到缺失值:

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%.

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

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

推荐阅读