Pandas拆分字符串列为多列并动态命名列的技术问题咨询
Pandas 键值对字符串列动态拆分方案
需求说明
现有DataFrame结构如下,fuzzy_market列存储了多组方括号包裹的键值对,键与值用冒号分隔,需要将其动态拆分为独立列,无对应值的单元格填充None。
原始DataFrame示例
| study_id | fuzzy_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_id | Age | Country of Birth | Country | Language | Management experience |
|---|---|---|---|---|---|
| study1 | 18-67 | Austria, Germany | Austria, Germany | German | None |
| study2 | None | None | Germany | None | Yes |
| study3 | None | None | United Kingdom | English | None |
| study4 | 18-67 | Austria, Germany | Austria, Germany | German | None |
| study5 | 48-99 | None | None | None | None |
可行解决方案
核心思路是先用正则提取所有方括号内的键值对,避免值中包含逗号导致拆分错误,再将每行的键值对转为字典后合并为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
相关产品推荐
相关产品推荐

