如何无需两次归一化再合并,直接从含多字典列表的字典创建DataFrame?
问题
现有实现是对dummy_data中的key3list和key4list分别调用pd.json_normalize生成key3_df、key4_df,再通过pd.merge合并得到目标DataFrame。请问是否存在更高效的方法,无需两次归一化再合并,直接从给定数据生成目标DataFrame?
数据
dummy_data = { "key1": "val1", "key2": "val2", "key3list": [ { "key3nestedkey1": "val3list1nested1", "key3nestedkey2": "val3list1nested2" }, { "key3nestedkey1": "val3list2nested1", "key3nestedkey2": "val3list2nested2" } ], "key4list": [ { "key4nestedkey1": "val4list1nested1", "key4nestedkey2": "val4list1nested2" }, { "key4nestedkey1": "val4list2nested1", "key4nestedkey2": "val4list2nested2" } ] }
现有代码
import pandas as pd key3_df = pd.json_normalize(dummy_data, "key3list", ["key1", "key2"]) key4_df = pd.json_normalize(dummy_data, "key4list", ["key1", "key2"]) df = pd.merge(key3_df, key4_df, on=["key1", "key2"])
预期输出
key3nestedkey1 key3nestedkey2 key1 key2 key4nestedkey1 key4nestedkey2 0 val3list1nested1 val3list1nested2 val1 val2 val4list1nested1 val4list1nested2 1 val3list1nested1 val3list1nested2 val1 val2 val4list2nested1 val4list2nested2 2 val3list2nested1 val3list2nested2 val1 val2 val4list1nested1 val4list1nested2 3 val3list2nested1 val3list2nested2 val1 val2 val4list2nested1 val4list2nested2
解决方案
可以直接构造key3list和key4list的笛卡尔积,再结合顶层的key1、key2字段,一步生成目标DataFrame,无需两次归一化和合并操作:
import pandas as pd from itertools import product # 提取顶层公共字段 common = {"key1": dummy_data["key1"], "key2": dummy_data["key2"]} # 生成两个列表的笛卡尔积,合并每个组合的字典并添加公共字段 data = [{**k3, **k4, **common} for k3, k4 in product(dummy_data["key3list"], dummy_data["key4list"])] # 直接生成目标DataFrame df = pd.DataFrame(data)
这个方法利用itertools.product生成两个列表所有元素的组合,通过字典解包合并每个组合的键值对,最后传入pd.DataFrame即可得到预期结果。相比原方法,减少了两次json_normalize和一次merge的操作开销,逻辑更直接,执行效率也更高。
内容的提问来源于stack exchange,提问作者shaik moeed
相关产品推荐
相关产品推荐

