如何从Pandas DataFrame字符串列中提取指定字段生成新列
解决方案
你可以通过单字段独立正则匹配或者字符串解析为字典两种方式实现需求,不需要依赖字段顺序,具体实现如下:
方法1:单字段正则匹配(代码更简洁)
每个目标字段单独写正则匹配,不受其他字段顺序、是否存在的影响:
import pandas as pd # 假设你的原始DataFrame为df,存目标字符串的列名为raw_str df['Type'] = df['raw_str'].str.extract(r'^(\w+)\(') df['conId'] = df['raw_str'].str.extract(r'conId=(\d+)').astype('int64') df['symbol'] = df['raw_str'].str.extract(r"symbol='([^']+)'") df['localSymbol'] = df['raw_str'].str.extract(r"localSymbol='([^']+)'") # 提取最终需要的列即可 res = df[['Type', 'conId', 'symbol', 'localSymbol']]
方法2:解析为字典(扩展性更强)
如果后续需要提取更多字段,可直接把字符串解析为键值对字典再统一取值:
def parse_contract_str(s): # 拆分类型和参数部分 type_name, args_str = s.split('(', 1) args_str = args_str.rstrip(')') # 解析所有参数为字典 args_dict = {} for kv in args_str.split(', '): k, v = kv.split('=', 1) # 自动去掉字符串两端的引号 if v.startswith(("'", '"')) and v.endswith(("'", '"')): v = v.strip("'\"") args_dict[k] = v args_dict['Type'] = type_name return args_dict # 应用解析函数后转成DataFrame parsed_df = df['raw_str'].apply(parse_contract_str).apply(pd.Series) # 提取目标字段,转换conId为数值类型 res = parsed_df[['Type', 'conId', 'symbol', 'localSymbol']] res['conId'] = res['conId'].astype('int64')
两种方法都可以得到你期望的输出结果,之前用str.extract没有得到预期结果,大概率是你写了按固定顺序匹配多个字段的正则,和实际行内的字段顺序不匹配导致的。
内容的提问来源于stack exchange,提问作者younggotti
相关产品推荐
相关产品推荐

