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

如何从Pandas DataFrame的嵌套字典中提取值并转换格式

问题描述

我有如下Pandas DataFrame:

NameAB
$overall{'all': 26929}{'all': 2036}
QWE{'$overall': {'all': 6},'Mar 18, 2021': {'all': 3},'Mar 3, 2021': {'all': 3}}{'$overall': {'all': 3},'Mar 3, 2021': {'all': 2},'Mar 18, 2021': {'all': 1}}

期望转换为如下格式的DataFrame:

NameDateAB
XYZ269292036
QWEMar 3, 202132
QWEMar 18, 202131

我尝试了以下代码:

df = df.apply(lambda s: s.str['all']).fillna(0).convert_dtypes()

得到的输出不符合预期:

NameAB
XYZ269292036
QWE00
QWE00

另外,df.to_dict()的返回结果如下:

{
    'A': {
        '$XYZ': {'all': 26929},   
        'QWE': {
            '$overall': {'all': 6},    
            'Mar 18, 2021': {'all': 3},    
            'Mar 3, 2021': {'all': 3}
        }
    },
    'B': {
        '$XYZ': {'all': 2036},   
        'QWE': {
            '$overall': {'all': 3},    
            'Mar 3, 2021': {'all': 2},    
            'Mar 18, 2021': {'all': 1}
        }
    },
    'Name': {
        '$XYZ': '$overall',   
        'QWE': 'QWE'
    }
}

需要实现从嵌套字典中提取值并转换为目标格式。

解决方法

可以通过逐行解析嵌套字典来生成目标数据,具体代码如下:

import pandas as pd

# 假设原始DataFrame为df
result = []

for idx, row in df.iterrows():
    current_name = row['Name']
    # 处理对应XYZ的行(原Name为$overall)
    if current_name == '$overall':
        a_val = row['A']['all']
        b_val = row['B']['all']
        result.append({'Name': 'XYZ', 'Date': '', 'A': a_val, 'B': b_val})
    else:
        # 处理QWE行,过滤掉$overall键,只保留日期相关数据
        target_dates = [key for key in row['A'].keys() if key != '$overall']
        for date in target_dates:
            a_val = row['A'][date]['all']
            b_val = row['B'][date]['all']
            result.append({'Name': current_name, 'Date': date, 'A': a_val, 'B': b_val})

# 转换为目标DataFrame
final_df = pd.DataFrame(result)

运行上述代码后,即可得到符合预期格式的DataFrame。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 09:03:11