You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

使用正则表达式拆分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的NameB列合并:

# 重置索引,去掉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

火山引擎 最新活动