如何用Pandas提取字符间子串,将单列键值文本拆分为多列?
解决Pandas中键值对文本列的拆分问题
方法1:正则表达式批量提取(推荐)
直接用str.extract配合捕获组,一次性提取所有目标列,无需依赖固定长度:
import pandas as pd # 示例DataFrame df = pd.DataFrame({ 'Value_column': ['Car:"Ford",Colour:"Black", Price:2000, '] }) # 正则匹配,捕获每个键对应的取值 df[['Car', 'Colour', 'Price']] = df['Value_column'].str.extract( r'Car:"(.*?)",Colour:"(.*?)", Price:(\d+),', expand=True ) # 查看结果 print(df[['Car', 'Colour', 'Price']])
输出:
Car Colour Price 0 Ford Black 2000
正则说明:(.*?)是非贪婪匹配,会精准捕获到下一个分隔符前的内容;(\d+)专门匹配数字类型的Price值,避免多余字符。
方法2:转字典后展开
如果文本格式接近字典结构,可以先清洗字符串再转成字典,再拆分列:
import pandas as pd import ast # 清洗字符串:去掉末尾多余的逗号,把Price的数字转为字符串格式(符合字典语法) df['cleaned'] = df['Value_column'].str.rstrip(', ').replace(r'Price:(\d+)', r'Price:"\1"', regex=True) # 转成字典 df['dict_col'] = df['cleaned'].apply(ast.literal_eval) # 展开字典为列 df = pd.concat([df, df['dict_col'].apply(pd.Series)], axis=1) # 提取目标列 print(df[['Car', 'Colour', 'Price']])
这种方法扩展性更强,如果后续新增键值对,无需修改正则,只要格式符合字典规则即可。
原有方法的局限性
你之前通过固定截取长度的方式只适用于已知取值长度的场景,一旦文本内容变化(比如Car是"Toyota",长度6),代码就会失效。上面两种方法都是基于内容匹配而非固定位置,能适配不同长度的取值。
内容的提问来源于stack exchange,提问作者fred.schwartz
相关产品推荐
相关产品推荐

