You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Pandas拆分字符串列为多列并动态命名列的技术问题咨询

Pandas 键值对字符串列动态拆分方案

需求说明

现有DataFrame结构如下,fuzzy_market列存储了多组方括号包裹的键值对,键与值用冒号分隔,需要将其动态拆分为独立列,无对应值的单元格填充None。

原始DataFrame示例

study_idfuzzy_market
study1[Age: 18-67], [Country of Birth: Austria, Germany], [Country: Austria, Germany], [Language: German]
study2[Country: Germany], [Management experience: Yes]
study3[Country: United Kingdom], [Language: English]
study4[Age: 18-67], [Country of Birth: Austria, Germany], [Country: Austria, Germany], [Language: German]
study5[Age: 48-99]

预期输出格式

study_idAgeCountry of BirthCountryLanguageManagement experience
study118-67Austria, GermanyAustria, GermanyGermanNone
study2NoneNoneGermanyNoneYes
study3NoneNoneUnited KingdomEnglishNone
study418-67Austria, GermanyAustria, GermanyGermanNone
study548-99NoneNoneNoneNone

可行解决方案

核心思路是先用正则提取所有方括号内的键值对,避免值中包含逗号导致拆分错误,再将每行的键值对转为字典后合并为DataFrame。

完整代码

import pandas as pd
import numpy as np
import re

np.random.seed(12345)

# 初始化测试数据
df = pd.DataFrame.from_dict({'study_id': {0: 'study1',
  1: 'study2',
  2: 'study3',
  3: 'study4',
  4: 'study5'},
 'fuzzy_market': {0: '[Age: 18-67], [Country of Birth: Austria, Germany], [Country: Austria, Germany], [Language: German]',
  1: '[Country: Germany], [Management experience: Yes]',
  2: '[Country: United Kingdom], [Language: English]',
  3: '[Age: 18-67], [Country of Birth: Austria, Germany], [Country: Austria, Germany], [Language: German]',
  4: '[Age: 48-99]'}})

# 单行键值对解析函数
def parse_fuzzy_market(content):
    # 正则匹配所有方括号内的内容
    kv_pairs = re.findall(r'\[(.*?)\]', content)
    kv_dict = {}
    for pair in kv_pairs:
        # 仅按第一个冒号拆分,避免值中包含冒号的异常
        key, value = pair.split(':', 1)
        kv_dict[key.strip()] = value.strip()
    return pd.Series(kv_dict)

# 执行拆分并合并结果
result = df[['study_id']].join(df['fuzzy_market'].apply(parse_fuzzy_market))
# 统一将空值替换为None
result = result.where(pd.notnull(result), None)

print(result)

代码说明

  • 用正则r'\[(.*?)\]'提取所有方括号包裹的内容,避开了值中逗号的干扰,解决了直接按逗号拆分导致值被截断的问题
  • 拆分键值对时指定split(':', 1)仅拆分第一个冒号,兼容值中包含冒号的场景
  • 自动识别所有出现的键生成列,无需提前指定列名,满足动态生成列的需求
  • 最后统一替换空值为None,符合输出要求

内容的提问来源于stack exchange,提问作者meenaparam

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 04:48:05