如何在pandas中将多层嵌套字典列表扁平化并转换为DataFrame
嵌套结构转DataFrame解决方案
实现思路
- 遍历首层每个字典,自动拆分公共固定字段(值为非列表类型)和待展开的嵌套列表字段
- 将每个嵌套列表转为独立DataFrame,对所有嵌套列表的DataFrame执行笛卡尔积拼接
- 将拼接后的嵌套数据与公共字段关联合并,最后汇总所有首层字典的处理结果得到最终DataFrame
完整实现代码
import pandas as pd def nested_to_df(input_list): all_item_res = [] for item in input_list: # 拆分公共字段和嵌套列表字段 common_info = {} nested_dfs = [] for key, value in item.items(): if not isinstance(value, list): common_info[key] = value else: nested_dfs.append(pd.DataFrame(value)) # 公共字段转为DataFrame common_df = pd.DataFrame([common_info]) # 无嵌套列表场景直接返回公共字段 if not nested_dfs: all_item_res.append(common_df) continue # 多嵌套列表做笛卡尔积 for df in nested_dfs: df['_temp_join_key'] = 0 merged_nested = nested_dfs[0] for df in nested_dfs[1:]: merged_nested = merged_nested.merge(df, on='_temp_join_key') merged_nested.drop('_temp_join_key', axis=1, inplace=True) # 关联公共字段与嵌套数据 common_df['_temp_join_key'] = 0 item_final = common_df.merge(merged_nested, on='_temp_join_key').drop('_temp_join_key', axis=1) all_item_res.append(item_final) # 合并所有条目结果,空值替换为空字符串匹配示例输出格式 final_df = pd.concat(all_item_res, ignore_index=True).fillna('') return final_df # 测试调用 if __name__ == "__main__": l = [ {'id': 1, 'name': 'a', 'obj2': [{'a': 3, 'b': 6}, {'a':4, 'b': 5}], 'obj': [{'x': 6, 'y': 'p'}, {'x': 10, 'y': 'q', 'z': 'qqq'}]}, {'id': 2, 'name': 'b', 'obj': [{'x': 10, 'y': 'r'}], 'obj2': [{'a': 9, 'i': 's'}]} ] res_df = nested_to_df(l) print(res_df)
方案适配性说明
- 无需硬编码嵌套列表的键名,自动识别首层字典中所有值为列表的字段
- 自动适配嵌套字典的不同键名,缺失字段自动填充空值
- 支持任意数量的嵌套列表场景,自动完成多组嵌套列表的笛卡尔积展开
内容的提问来源于stack exchange,提问作者Andrei Toader
相关产品推荐
相关产品推荐

