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

如何将指定字典转为保留嵌套值的单行Pandas DataFrame

嵌套字典转单行Pandas DataFrame的解决方案

有如下嵌套字典,需要转换为仅包含key、metrics、collectionPeriod三列的单行Pandas DataFrame,保留各列的嵌套值后续处理:

res = {
    'key': {'formFactor': 'PHONE', 'origin': 'https://www.sample'},
    'metrics': {
        'cumulative_layout_shift': {
            'histogram': [
                {'start': '0.00', 'end': '0.10', 'density': 0.7861256879559706},
                {'start': '0.10', 'end': '0.25', 'density': 123},
                {'start': '0.25', 'density': 111}
            ],
            'percentiles': {'p75': '0.07'}
        },
        'experimental_interaction_to_next_paint': {
            'histogram': [
                {'start': 0, 'end': 200, 'density': 0.5416453755748598},
                {'start': 200, 'end': 500, 'density': 1},
                {'start': 500, 'density': 23}
            ],
            'percentiles': {'p75': 504}
        },
        'experimental_time_to_first_byte': {
            'histogram': [
                {'start': 0, 'end': 800, 'density': 123},
                {'start': 800, 'end': 1800, 'density': 123},
                {'start': 1800, 'density': 23}
            ],
            'percentiles': {'p75': 877}
        },
        'first_contentful_paint': {
            'histogram': [
                {'start': 0, 'end': 1800, 'density': 22},
                {'start': 1800, 'end': 3000, 'density': 664},
                {'start': 3000, 'density': 67}
            ],
            'percentiles': {'p75': 1662}
        },
        'first_input_delay': {
            'histogram': [
                {'start': 0, 'end': 100, 'density': 234},
                {'start': 100, 'end': 300, 'density': 44},
                {'start': 300, 'density': 555}
            ],
            'percentiles': {'p75': 34}
        },
        'largest_contentful_paint': {
            'histogram': [
                {'start': 0, 'end': 2500, 'density': 0.7725250984877367},
                {'start': 2500, 'end': 4000, 'density': 777},
                {'start': 4000, 'density': 544}
            ],
            'percentiles': {'p75': 2352}
        }
    },
    'collectionPeriod': {
        'firstDate': {'year': 2022, 'month': 10, 'day': 14},
        'lastDate': {'year': 2022, 'month': 11, 'day': 10}
    }
}

使用pd.DataFrame.from_dict(res, orient='columns')转换后,DataFrame会以key的嵌套值(formFactor、origin)作为索引,不符合单行三列的需求。


错误原因

orient='columns'会将字典中每个顶层key对应的嵌套字典的键作为行索引,把顶层key作为列,导致生成的DataFrame行数等于嵌套字典的键数量,而非单行。


解决方案

方法1:将字典包装为列表直接构造

把原字典放入列表中,Pandas会将列表中的每个元素作为一行数据:

import pandas as pd

df = pd.DataFrame([res])

方法2:使用orient='index'并转置

先以顶层key为行构造DataFrame,再转置为列:

df = pd.DataFrame.from_dict(res, orient='index').T

方法3:手动指定列和行数据

直接构造包含目标列的DataFrame,将每个顶层key对应的嵌套结构作为单元格值:

df = pd.DataFrame({
    'key': [res['key']],
    'metrics': [res['metrics']],
    'collectionPeriod': [res['collectionPeriod']]
})

验证结果

以上任意方法生成的DataFrame均为单行,包含key、metrics、collectionPeriod三列,每列保留原始嵌套结构,符合需求。示例验证代码:

print(df.shape)  # 输出 (1, 3)
print(df.columns)  # 输出 Index(['key', 'metrics', 'collectionPeriod'], dtype='object')

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 11:25:38