DataFrame多字典列用Series.explode展开后行匹配错误求助
解决DataFrame多字典列展开的行匹配问题
问题场景
你需要将DataFrame中包含多个字典的两列展开为多列,但使用Series.explode时出现行内容错位的问题:
输入数据
| Column A | Column B | Columns C |
|---|---|---|
| Cell 1 | {"a":0.5} {"b":0.5} | {"d1":0.25}{"d2":0.25}{"d3":0.25}{"d4":0.25} |
| Cell 2 | {"c":1.0} | {"t1":0.5} {"t2":0.5} |
期望输出
| Column A | Column B1 | Columns B2 | Columns C1 | Columns C2 |
|---|---|---|---|---|
| Cell 1 | "a" | 0.5 | "d1" | 0.25 |
| Cell 1 | "a" | 0.5 | "d2" | 0.25 |
| Cell 1 | "b" | 0.5 | "d3" | 0.25 |
| Cell 1 | "b" | 0.5 | "d4" | 0.25 |
| Cell 2 | "c" | 1.0 | "t1" | 0.5 |
| Cell 2 | "c" | 1.0 | "t2" | 0.5 |
你尝试的错误代码
df1 = ( df.assign(Columns B2 =lambda df: df.Columns B.apply(lambda x: x.values())) .reset_index() .apply(pd.Series.explode) ) output = ( df1.assign(Columns C2 =lambda df: df.Columns C.apply(lambda x: x.values())) .reset_index() .apply(pd.Series.explode) )
问题:两次独立explode后,行内容错位,比如Columns C的内容无法对应正确的Column B分组。
解决方案
核心问题是两次explode没有保留原始行的分组关联,导致B和C的元素无法正确配对。正确做法是先对每行生成B和C字典列表的笛卡尔积,再拆分键值对:
import pandas as pd import ast from itertools import product # 模拟输入数据(如果你的数据是从文件读取,可替换这部分) data = { "Column A": ["Cell 1", "Cell 2"], "Column B": ['{"a":0.5} {"b":0.5}', '{"c":1.0}'], "Columns C": ['{"d1":0.25}{"d2":0.25}{"d3":0.25}{"d4":0.25}', '{"t1":0.5} {"t2":0.5}'] } df = pd.DataFrame(data) # 将单元格中的多字典字符串转换为字典列表 def str_to_dict_list(s): # 处理字典之间无空格的情况,统一分割规则 dict_strs = [d.strip() for d in s.replace('}{', '} {').split(' ') if d.strip()] return [ast.literal_eval(d) for d in dict_strs] df['Column B'] = df['Column B'].apply(str_to_dict_list) df['Columns C'] = df['Columns C'].apply(str_to_dict_list) # 对每行生成B和C字典的笛卡尔积,并拆分键值 def expand_row(row): base_val = row['Column A'] b_dicts = row['Column B'] c_dicts = row['Columns C'] # 生成所有B与C的组合 pairs = product(b_dicts, c_dicts) # 转换为目标格式的行数据 return pd.DataFrame([ { 'Column A': base_val, 'Column B1': next(iter(b.keys())), 'Column B2': next(iter(b.values())), 'Columns C1': next(iter(c.keys())), 'Columns C2': next(iter(c.values())) } for b, c in pairs ]) # 合并所有行的结果 final_df = pd.concat(df.apply(expand_row, axis=1).tolist(), ignore_index=True) print(final_df)
代码说明
- 字符串转字典列表:处理单元格中多字典的不同分隔格式(有空格/无空格),将每个字符串转换为可操作的字典列表。
- 笛卡尔积生成:对每行的B字典列表和C字典列表生成所有可能的配对,确保每个B元素都能和所有C元素一一对应。
- 键值拆分:将每个字典的键和值分别提取为对应的列,最终合并成目标DataFrame。
内容的提问来源于stack exchange,提问作者SHAIMA ALJAHANI
相关产品推荐
相关产品推荐

