pandas 将一系列奇怪的嵌套字典转换为 Dataframe

jum4pzuy  于 2023-04-10  发布在  其他
关注(0)|答案(2)|浏览(109)

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

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"}]}]

我想把它转换成
| 唯一的|萨莱努姆|日期|价格|
| --------------|--------------|--------------|--------------|
| 一百|1|十二岁|二百三十|
| 一百|二|十三|二百三十四|
| 一百|三|十四岁|三百八十二|
| 一百零一|1|二十五|三百八十二|
| 一百零一|二|二十六|四九三|
| 一百零一|三|二十八|三百八十四|
| 一百零二|1|二十五|三百三十四|
| 一百零二|二|二十六|二百七十三|
| 一百零二|三|二十八|三九四|
其中一个问题是,数据可能非常大,因为有超过100万个唯一的id,所以我想问一下如何在Python中有效地将列表转换为 Dataframe 。
谢谢大家!

q1qsirdb

q1qsirdb1#

explodejson_normalize的一个选项:

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

或者使用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']])

输出:

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
5t7ly7z5

5t7ly7z52#

def function1(ss:pd.Series):
    ss1=pd.Series(ss.Content)
    return pd.concat([ss[["uniqueid"]],ss1])

pd.DataFrame(lst).explode("Content").apply(function1,1)

输出:

SaleNum Date Price uniqueid
0       1   12   230      100
0       2   13   234      100
0       3   14   382      100
1       1   25   382      101
1       2   26   493      101
1       3   28   384      101
2       1   25   334      102
2       2   26   273      102
2       3   28   394      102

相关问题