pandas使用str.extract()返回空DataFrame问题求解
问题根因
你当前用str.extract()返回空的核心原因是:str访问器仅适用于Pandas Series中存储字符串类型的场景,而你已经对原始数据做了split()操作,此时journal Series的每行存储的是Python列表,自然无法用正则匹配字符串的方式提取内容。
另外你原有正则的价格匹配规则存在兼容问题:规则\d+[,.]\d+[,.]\d+要求价格必须有2个分隔符,适配不了第一个样本里仅带1个逗号的2,57格式,也是匹配失效的原因之一。
正确实现方案
方案1:直接从拆分后的列表提取(更高效,无需二次正则匹配)
你已经完成了拆分操作,直接按规则匹配列表内的元素即可:
import pandas as pd # 定义提取规则函数 def extract_info(row_list): code = None code1 = None price = None for item in row_list: # 匹配10位数字的Code if isinstance(item, str) and item.isdigit() and len(item) == 10: code = item # 匹配两位数字的Code1 elif isinstance(item, str) and item.isdigit() and len(item) == 2: code1 = item # 匹配带逗号的价格字段 elif isinstance(item, str) and ',' in item: price = item return pd.Series([code, code1, price], index=['Code', 'Code1', 'Price']) # 应用到journal Series生成新DataFrame result = journal.apply(extract_info)
方案2:沿用正则匹配的修改方案
如果要沿用你之前的正则逻辑,需要先把每行的列表拼接回字符串,同时调整价格匹配规则:
# 先把每行列表转为空格分隔的字符串,再执行调整后的正则提取 t = journal.str.join(' ').str.extract(r'00\d\D+(\d{10})\D+(\d{2})\D+(\d+(?:[.,]\d+)*,\d+)') t.columns = ['Code', 'Code1', 'Price']
内容的提问来源于stack exchange,提问作者HappyCane
相关产品推荐
相关产品推荐

