如何使用json_normalize多层解析并合并Pandas DataFrame?
解决方法
1. 解析嵌套数组时直接保留关联键
不要单独解析steps,而是在pd.json_normalize中通过record_path指定嵌套数组路径,同时用meta参数把原数据里的value字段(或其他需要关联的标识字段)一并保留,这样生成的df_normal自带关联键,直接就能和df_channel连接。
假设你的原始JSON结构示例如下:
[ { "value": "channel_001", "progression": { "steps": [{"step_id": 1, "action": "init"}, {"step_id": 2, "action": "process"}] }, "desc": "test channel" } ]
对应解析代码:
import pandas as pd # 假设原始JSON数据存储在data变量中 df_normal = pd.json_normalize( data, record_path=['progression', 'steps'], # 指定嵌套的steps数组路径 meta=['value'] # 保留关联键value )
此时df_normal包含value字段,直接执行左连接即可:
merged_df = df_channel.merge(df_normal, on='value', how='left')
2. 已生成无关联键的df_normal时补全键
如果已经得到了df_channel和无关联键的df_normal,可以通过索引对齐+字段展开的方式补全关联键:
# 先计算每个channel对应的steps数量 df_channel['steps_len'] = df_channel['progression'].apply(lambda x: len(x['steps']) if x.get('steps') else 0) # 按steps_len重复value字段,生成和df_normal行数匹配的关联键列表 expanded_values = df_channel['value'].repeat(df_channel['steps_len']).reset_index(drop=True) # 把关联键加入df_normal df_normal['value'] = expanded_values # 执行左连接 merged_df = df_channel.merge(df_normal, on='value', how='left')
注意事项
- 若
progression.steps存在空数组的情况,要在计算长度时做空值判断,避免repeat操作报错 - 确保
value字段是df_channel中唯一标识每条数据的键,否则连接后会出现冗余重复行
内容的提问来源于stack exchange,提问作者Derek Gunn
相关产品推荐
相关产品推荐

