Pandas str.extract正则提取Price_Min_COR对应值的正确写法
提取指定字符间子串的实现方案
已知需求信息
- 待处理目标字符串:
{'Price_Min_COR': 21561.32, 'Price_Max_COR': 21600} - 起始定位字符:
'Price_Min_COR': - 结束定位字符:
, - 预期提取结果:21561.32
前期代码失效原因
- 第一版正则用双引号包裹
Price_Min_COR,和目标字符串里的单引号格式不匹配,无法命中起始位置 - 第二版正则没有匹配
'Price_Min_COR':后紧跟的空格,且\b单词边界放置位置错误,捕获逻辑失效 - 未显式将字典对象转为字符串类型,部分场景下str访问器的匹配行为会出现异常
可用实现方案
正则提取方案
使用如下正则即可正确提取目标值,测试代码可直接运行:
import pandas as pd import numpy as np Open_Time_s=['2022-04-30 11:05:00+03:00','2022-04-30 11:10:00+03:00', np.nan, np.nan] dici=[np.nan,np.nan,{'Price_Min_COR': 21561.32, 'Price_Max_COR': 21600},{'Price_Min_COR': 21561.32, 'Price_Max_COR': 21600}] df = pd.DataFrame.from_dict({'OPEN_TIME':Open_Time_s,'dicts':dici}) # 正确正则提取代码 result = df[df['dicts'].notna()].dicts.astype(str).str.extract(r"'Price_Min_COR':\s*([^,]+)") print(result)
正则逻辑说明:
'Price_Min_COR'::精准匹配指定的起始定位字符串,和目标格式完全对齐\s*:匹配冒号后任意数量的空白字符,兼容不同空格数量的场景([^,]+):捕获组,匹配所有非逗号的连续字符,遇到结束定位符逗号自动停止,捕获内容就是目标数值
更稳妥的非正则方案
如果列中存储的是原生字典对象,不需要转字符串用正则提取,直接取键值的方式稳定性更高,不会受字符串格式变动影响:
result = df[df['dicts'].notna()].dicts.apply(lambda x: x.get('Price_Min_COR')) print(result)
内容的提问来源于stack exchange,提问作者максим ильин
相关产品推荐
相关产品推荐

