API调用 - 多维嵌套字典到pandas数据框

时间:2016-09-20 22:05:58

标签: python json pandas dictionary dataframe

我需要你帮助将多维dict转换为pandas数据框。我从一个JSON文件中获取dict,我从API调用(Shopify)中检索该文件。

response = requests.get("URL", auth=("ID","KEY")) 
data = json.loads(response.text)

"数据"字典看起来如下:

{'orders': [{'created_at': '2016-09-20T22:04:49+02:00',
             'email': 'test@aol.com',
             'id': 4314127108,
             'line_items': [{'destination_location': 
                                       {'address1': 'Teststreet 12',
                                        'address2': '',
                                        'city': 'Berlin',
                                        'country_code': 'DE',
                                        'id': 2383331012,
                                        'name': 'Test Test',
                                        'zip': '10117'}, 
                             'gift_card': False,
                             'name': 'Blueberry Cup'}]
}]}

在这种情况下,字典有4个维度,我想将dict转换为pandas数据框。我尝试了从json_normalize()到pandas.DataFrame.from_dict()的所有内容,但我没有设法到达任何地方。当我尝试将dict转换为df时,我会得到包含列表列表的列。

有谁知道如何处理?

由于

编辑:

谢谢@piRSquared。你的解决方案工作正常但是,如果订单中有其他产品,您如何解决?因为它确实有效。具有2个产品的订单的JSON响应如下(目标是具有相同的第二行" created_at"。" email"等列):

{'orders': [{'created_at': '2016-09-20T22:04:49+02:00',
             'email': 'test@aol.com',
             'id': 4314127108,
             'line_items': [{'destination_location': 
                                       {'address1': 'Teststreet 12',
                                        'address2': '',
                                        'city': 'Berlin',
                                        'country_code': 'DE',
                                        'id': 2383331012,
                                        'name': 'Test Test',
                                        'zip': '10117'}, 
                             'gift_card': False,
                             'name': 'Blueberry Cup'},
                             {'destination_location': 
                                       {'address1': 'Teststreet 12',
                                        'address2': '',
                                        'city': 'Berlin',
                                        'country_code': 'DE',
                                        'id': 2383331012,
                                        'name': 'Test Test',
                                        'zip': '10117'}, 
                             'gift_card': False,
                             'name': 'Strawberry Cup'}]
}]}

因此,对于所有销售的产品,最终的df应该是逐行的。谢谢,非常感谢你的帮助!

1 个答案:

答案 0 :(得分:0)

有很多方法可以做到这一点。这只是我决定这样做的一种方式。你需要探索你想要看到它的代表,然后找出如何到达那里。

df = pd.DataFrame(data['orders'])

df1 = df.line_items.str[0].apply(pd.Series)

df2 = df1.destination_location.apply(pd.Series)

pd.concat([df.drop('line_items', 1), df1.drop('destination_location', 1), df2],
          axis=1, keys=['', 'line_items', 'destination_location'])

enter image description here