Pandas DataFrame 来自 dict 的嵌套列表

Pandas DataFrame from nested list of dict

提问人:8ndra 提问时间:11/5/2022 最后编辑:8ndra 更新时间:11/6/2022 访问量:99

问:

我正在从 facebook api 接收到字典列表的数据。我想从这个列表中创建 pandas DataFrame。

data = [{'account_id': '1234', 'account_name': 'account1', 'adset_id': '238', 'adset_name': 'Audio-Video', 'impressions': '24140', 'actions': [{'action_type': 'onsite_conversion.post_save', 'value': '1'}, {'action_type': 'link_click', 'value': '1081'}], 'date_start': '2022-11-01', 'date_stop': '2022-11-01'},
{'account_id': '1234', 'account_name': 'account2', 'adset_id': '591', 'adset_name': 'Moto', 'impressions': '16657', 'actions': [{'action_type': 'link_click', 'value': '620'}, {'action_type': 'post', 'value': '1'}], 'date_start': '2022-11-01', 'date_stop': '2022-11-01'} ]

但其中一列(操作)是嵌套的。我想将其“解压缩”到新列。

我在努力

df = pandas.DataFrame.from_dict(res)

结果是:

  account_id account_name adset_id   adset_name impressions                                                                                                                  actions  date_start   date_stop
0       1234     account1      238  Audio-Video       24140  [{'action_type': 'onsite_conversion.post_save', 'value': '1'}, {'action_type': 'link_click', 'value': '1081'}]  2022-11-01  2022-11-01
1       1234     account2      591         Moto       16657  [{'action_type': 'link_click', 'value': '620'}, {'action_type': 'post', 'value': '1'}]                          2022-11-01  2022-11-01

但期望的结果应该是:

  account_id account_name adset_id   adset_name impressions  onsite_conversion.post_save  link_click         post  date_start   date_stop
0       1234     account1      238  Audio-Video       24140                            1        1081            0  2022-11-01  2022-11-01
1       1234     account2      591         Moto       16657                            0         620            1  2022-11-01  2022-11-01

对熊猫最有效的方法是什么? 谢谢!

Python Pandas 数据帧 嵌套列表

评论

0赞 The Singularity 11/5/2022
的可能值是多少?action_type
0赞 The Singularity 11/5/2022
预期输出不显示如何处理{'action_type': 'post', 'value': '1'}
0赞 8ndra 11/6/2022
谢谢,我编辑了有问题的结果。的可能值 should't matteraction_type

答:

0赞 mozway 11/5/2022 #1

IIUC,您可以尝试和:json_normalizepivot

df = pd.DataFrame(data)

s = df.pop('actions').explode()

df = df.join(pd
   .json_normalize(s).set_axis(s.index)
   .reset_index()
   .pivot_table(index='index', columns='action_type', values='value', fill_value=0)
 )

print(df)

输出:

  account_id account_name adset_id   adset_name impressions  date_start  \
0       1234     account1      238  Audio-Video       24140  2022-11-01   
1       1234     account2      591         Moto       16657  2022-11-01   

    date_stop  link_click  onsite_conversion.post_save  post  
0  2022-11-01        1081                            1     0  
1  2022-11-01         620                            0     1