将奇怪的嵌套字典列表转换为数据框

suc*_*ath 2 python performance dictionary list pandas

我有一个奇怪的列表,其中嵌套了一些字典,看起来像这样:

lst = [{"uniqueid": "100","Content":[{"SaleNum":"1","Date":"12","Price":"230"}, {"SaleNum":"2","Date":"13","Price":"234"}, {"SaleNum":"3","Date":"14","Price":"382"}]}, 
       {"uniqueid": "101","Content":[{"SaleNum":"1","Date":"25","Price":"382"}, {"SaleNum":"2","Date":"26","Price":"493"}, {"SaleNum":"3","Date":"28","Price":"384"}]},
       {"uniqueid": "102","Content":[{"SaleNum":"1","Date":"25","Price":"334"}, {"SaleNum":"2","Date":"26","Price":"273"}, {"SaleNum":"3","Date":"28","Price":"394"}]}]
Run Code Online (Sandbox Code Playgroud)

我想将其转换为以下形式的表格

唯一身份 萨莱纳姆 日期 价格
100 1 12 230
100 2 13 234
100 3 14 第382章
101 1 25 第382章
101 2 26 第493章
101 3 28 第384章
102 1 25 第334章
102 2 26 273
102 3 28 第394章

问题之一是数据可能非常大,因为有超过 100 万个唯一 id,所以我想询问如何有效地将列表转换为 Python 中的数据框架。

谢谢你!

moz*_*way 6

explode与的一种选择json_normalize

df = (pd.DataFrame.from_records(lst).explode('Content', ignore_index=True)
        .pipe(lambda d: d.join(pd.json_normalize(d.pop('Content'))))
      )
Run Code Online (Sandbox Code Playgroud)

或者使用DataFrame构造函数和列表理解:

df = (pd.DataFrame([d|d2 for d in lst for d2 in d['Content']])
        .drop(columns='Content')
     )

# or if you only have uniqueid as external key
df = pd.DataFrame([{'uniqueid': d['uniqueid']}|d2
                   for d in lst for d2 in d['Content']])
Run Code Online (Sandbox Code Playgroud)

输出:

  uniqueid SaleNum Date Price
0      100       1   12   230
1      100       2   13   234
2      100       3   14   382
3      101       1   25   382
4      101       2   26   493
5      101       3   28   384
6      102       1   25   334
7      102       2   26   273
8      102       3   28   394
Run Code Online (Sandbox Code Playgroud)