使用正则表达式拆分Pandas DataFrame列并生成新列
解决Pandas DataFrame列拆分问题
这个需求完全可以通过正则表达式结合Pandas的字符串处理功能实现,我给你一套清晰的可落地实现步骤:
步骤1:准备测试数据
先还原你的原始DataFrame,方便后续测试验证:
import pandas as pd df = pd.DataFrame({ 'Name': ["'X'", "'Y'"], 'A': [ "'cde: 2.00 GB ghi: 4.00 GB ab-6: 9.00 GB'", "'cde: 1.00 GB ghi: 6.00 GB ab-6: 12.00 GB'" ], 'B': ["'abc'", "'abc'"] }) # 先去掉A列首尾的单引号(如果你的原始数据自带的话) df['A'] = df['A'].str.strip("'")
步骤2:编写正则表达式提取键值对
我们需要一个能精准匹配key: value GB结构的正则:
# 正则规则拆解: # (\w+-?\w+) 匹配键名,支持带短横线的格式(比如ab-6) # :\s* 匹配冒号及后面的任意空格 # (\d+\.\d+\s*GB) 匹配数值+GB的完整值格式 pattern = r'(\w+-?\w+):\s*(\d+\.\d+\s*GB)'
用str.extractall提取所有匹配项,这个方法会返回带多层索引的结果,包含每一行的所有键值对:
extracted = df['A'].str.extractall(pattern) # 给提取的列重命名,方便后续处理 extracted.columns = ['key', 'value']
步骤3:转换为宽格式并合并原数据
把提取的长格式数据转成你需要的宽格式,同时给新列加上A_前缀,最后和原DataFrame的Name、B列合并:
# 重置索引,去掉extractall生成的多余层级索引 extracted = extracted.reset_index(level=1, drop=True) # 转成宽格式,列名自动拼接成A_+键名的格式 pivoted = extracted.pivot(columns='key', values='value').add_prefix('A_') # 合并原数据的Name和B列,得到最终结果 result = pd.concat([df[['Name', 'B']], pivoted], axis=1)
最终效果
运行完代码后,result就是你想要的结构:
Name B A_ab-6 A_cde A_ghi 0 'X' 'abc' 9.00 GB 2.00 GB 4.00 GB 1 'Y' 'abc' 12.00 GB 1.00 GB 6.00 GB
补充说明
- 如果A列中键的顺序不固定,这个方法依然有效,pivot会自动按键名排序新列
- 如果有其他特殊格式的键(比如带下划线),可以把正则里的
(\w+-?\w+)改成([\w-]+),适配更多字符类型
内容的提问来源于stack exchange,提问作者Tobitor




