Python 数据帧的四维嵌套字典

Python 数据帧的四维嵌套字典,python,json,pandas,dictionary,dataframe,Python,Json,Pandas,Dictionary,Dataframe,我需要您的帮助,将多维dict转换为熊猫数据帧。我从一个JSON文件中获取dict,该文件是通过API调用(Shopify)检索的 “数据”字典如下所示: {'orders': [{'created_at': '2016-09-20T22:04:49+02:00', 'email': 'test@aol.com', 'id': 4314127108, 'line_items': [{'destination_loca

我需要您的帮助,将多维dict转换为熊猫数据帧。我从一个JSON文件中获取dict,该文件是通过API调用(Shopify)检索的

“数据”字典如下所示:

 {'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'}]
}]}
在本例中,字典有4个维度,我想将dict转换为pandas数据帧。我尝试了从json_normalize()到pandas.DataFrame.from_dict()的所有方法,但都没有成功。当我尝试将dict转换为df时,我会得到包含列表列表的列

我的目标是每个产品有一个单独的行。 谢谢

期望输出:

Created at  Email           id          Name
9/20/2016   test@test.de    4314127108  Blueberry Cup
9/20/2016   test@test.de    4314127108  Strawberry Cup

我真的不明白
json\u normalize()
怎么这么难做到这一点,我有两倍嵌套深度的类似数据,
json\u normalize()
仍然设法给我一个更好的结果

我编写此递归函数是为了用字典替换示例中的列表:

def removeList(D):
  for k in D.keys():
    if isinstance(D[k],list):
      T = {}
      for i in range(len(D[k])):
        T[str(i)] = D[k][i]
      D[k] = removeList(T)
      return D
    elif isinstance(D[k],dict):
      D[k] = removeList(D[k])
      return D
    else:
      return D
json\u normalize()
至少可以更好地处理结果

不过,我建议手动操作,即使这很烦人。您可以使用自己想要的结构创建自己的字典,手动将所有数据写入其中,然后将其转换为数据帧。这是检查数据一致性并执行所需的所有平坦化、预处理和规范化的好方法

因为我的数据结构与您的相似,所以我使用两步流程。在第一步中,我创建了一个扁平字典,它不包含任何其他字典,但在一个键中仍然有一个列表(在您的例子中是
line\u items
)。每个列表条目也被展平到一个简单的字典中。然后,我从字典列表中创建第二个数据帧,如下所示:

ListDF = pd.DataFrame.from_dict([iFr for sl in DF["List"] for iFr in sl])
因为我手动完成了所有的规范化,所以我能够向列表项添加必要的键,所以现在我可以使用这些键将两个数据帧合并到我的最终数据帧中。然后我放下
列表
列,我的最终数据结构就完成了,我从一个可怕的嵌套字典变成了一个简单的关系模式,可以轻松使用


我想这对你来说也是最好的。

我真的不明白
json\u normalize()
怎么这么难做到,我有两倍嵌套深度的类似数据,
json\u normalize()
仍然能给我更好的结果

我编写此递归函数是为了用字典替换示例中的列表:

def removeList(D):
  for k in D.keys():
    if isinstance(D[k],list):
      T = {}
      for i in range(len(D[k])):
        T[str(i)] = D[k][i]
      D[k] = removeList(T)
      return D
    elif isinstance(D[k],dict):
      D[k] = removeList(D[k])
      return D
    else:
      return D
json\u normalize()
至少可以更好地处理结果

不过,我建议手动操作,即使这很烦人。您可以使用自己想要的结构创建自己的字典,手动将所有数据写入其中,然后将其转换为数据帧。这是检查数据一致性并执行所需的所有平坦化、预处理和规范化的好方法

因为我的数据结构与您的相似,所以我使用两步流程。在第一步中,我创建了一个扁平字典,它不包含任何其他字典,但在一个键中仍然有一个列表(在您的例子中是
line\u items
)。每个列表条目也被展平到一个简单的字典中。然后,我从字典列表中创建第二个数据帧,如下所示:

ListDF = pd.DataFrame.from_dict([iFr for sl in DF["List"] for iFr in sl])
因为我手动完成了所有的规范化,所以我能够向列表项添加必要的键,所以现在我可以使用这些键将两个数据帧合并到我的最终数据帧中。然后我放下
列表
列,我的最终数据结构就完成了,我从一个可怕的嵌套字典变成了一个简单的关系模式,可以轻松使用


我想这对你来说也是最好的。

链接问题的可能副本给出了高于2的词典深度级别的想法。这不是我想要的。代码不起作用!主要的问题是列表和字典混合在一起。你能显示你想要的输出吗?链接问题的可能重复给了字典深度级别高于2的想法。这不是我想要的。代码不起作用!主要的问题是你的列表和字典混在一起。你能显示你想要的输出吗?谢谢你的帮助。你的功能正常。然而,我并不是100%地听从你的第二个建议。请参见上面的预期结果!你有一本四层的字典。您想要的是只有1层深的东西,因此它适合关系数据模型。所以你需要把结构弄平,把所有的东西,每把钥匙都放在同一个水平面上。我是说这最好是手动完成的,因为您可以完全控制数据最终的外观,并且可以进行预处理。谢谢您的帮助。你的功能正常。然而,我并不是100%地听从你的第二个建议。请参见上面的预期结果!你有一本四层的字典。您想要的是只有1层深的东西,因此它适合关系数据模型。所以你需要把结构弄平,把所有的东西,每把钥匙都放在同一个水平面上。我是说这最好是手动完成的,因为您可以完全控制数据最终的外观,并且可以进行预处理。