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

使用json_normalize展平字典列表为DataFrame列失败求助

解决方法

先模拟你的数据场景(方便复现):

import pandas as pd

df = pd.DataFrame({
    '原列1': ['示例数据1', '示例数据2'],
    'fields': [
        [{'id': '年龄', 'value': 28}, {'id': '城市', 'value': '北京'}],
        [{'id': '年龄', 'value': 32}, {'id': '城市', 'value': '上海'}]
    ]
})

方法一:字典推导式 + 合并DataFrame

这是最直接高效的方式,先把每行的fields列表转成{id: value}的字典,再转成DataFrame和原表合并:

# 把每个fields列表转成目标字典
flattened_fields = df['fields'].apply(lambda x: {item['id']: item['value'] for item in x})

# 转成DataFrame并和原表合并(去掉原fields列)
result = pd.concat([df.drop('fields', axis=1), pd.DataFrame(flattened_fields.tolist())], axis=1)

运行后result就是你要的结构:原列保留,新增以id为列名、value为内容的列。

方法二:explode + pivot

适合处理存在重复id或者需要更灵活分组的场景:

# 先把fields列表拆成每行一个字典
exploded_df = df.explode('fields')

# 从字典里提取id和value作为新列
exploded_df[['id', 'value']] = pd.DataFrame(exploded_df['fields'].tolist(), index=exploded_df.index)

# 按原索引 pivot 成宽表,再和原表合并
pivoted = exploded_df.pivot(index=exploded_df.index, columns='id', values='value').reset_index(drop=True)
result = pd.concat([df.drop('fields', axis=1), pivoted], axis=1)

关于pd.json_normalize的正确用法

你之前直接用pd.json_normalize(df["fields"])会把整个列的字典列表展开成多行记录,而不是每行对应新增列。正确用法是先把每行的列表转成单个字典,再用json_normalize:

flattened = pd.json_normalize(df['fields'].apply(lambda x: {item['id']: item['value'] for item in x}))
result = pd.concat([df.drop('fields', axis=1), flattened], axis=1)

本质和方法一逻辑一致,只是用json_normalize替代了pd.DataFrame.from_records。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.30 16:12:22