使用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
相关产品推荐
相关产品推荐

