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

DataFrame多字典列用Series.explode展开后行匹配错误求助

解决DataFrame多字典列展开的行匹配问题

问题场景

你需要将DataFrame中包含多个字典的两列展开为多列,但使用Series.explode时出现行内容错位的问题:

输入数据

Column AColumn BColumns 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 AColumn B1Columns B2Columns C1Columns 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)

代码说明

  1. 字符串转字典列表:处理单元格中多字典的不同分隔格式(有空格/无空格),将每个字符串转换为可操作的字典列表。
  2. 笛卡尔积生成:对每行的B字典列表和C字典列表生成所有可能的配对,确保每个B元素都能和所有C元素一一对应。
  3. 键值拆分:将每个字典的键和值分别提取为对应的列,最终合并成目标DataFrame。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 04:00:41