首页 > 解决方案 > DataFrame 的字典列表

问题描述

我有这样的数据,我希望将数据写入数据框中,以便可以直接将其转换为 csv 文件。

Data = 
[ {'event': 'User Clicked', 'properties': {'user_id': '123', 'page_visited': 'contact_us', etc},
{'event': 'User Clicked', 'properties': {'user_id': '456', 'page_visited': 'homepage', etc} , ...... 
{'event': 'User Clicked', 'properties': {'user_id': '789', 'page_visited': 'restaurant', etc}} ]

这就是我能够访问其值的方式:

for item in list_of_dict_responses:
            print item['event']
            for key, value in item.items():
                if type(value) is dict:
                    for k, v in value.items():
                        print k,v 

我希望它在一个数据框中,其中 event 是一个值为 User Clicked 的列,properties 是另一个具有子列的列,user_id, page_visited, contact_us然后是子列的相应值。

标签: pythonlistpandasdictionarydataframe

解决方案


展平嵌套字典,然后只需使用数据框构造函数来创建数据框。

data = [ 
  {'event': 'User Clicked', 'properties': {'user_id': '123', 'page_visited': 'contact_us'}},
  {'event': 'User Clicked', 'properties': {'user_id': '456', 'page_visited': 'homepage'}},
  {'event': 'User Clicked', 'properties': {'user_id': '789', 'page_visited': 'restaurant'}} 
]

可以以多种方式构造扁平化字典。这是使用通用生成器的 1 种方法,可用于任意深度的嵌套字典(或至少在达到最大递归深度之前)

def flatten(kv, prefix=[]):
    for k, v in kv.items():
        if isinstance(v, dict):
            yield from flatten(v, prefix+[str(k)])
        else:
            if prefix:
                yield '_'.join(prefix+[str(k)]), v
            else:
                yield str(k), v

然后使用列表推导将 中的所有记录展平data,构造数据框

pd.DataFrame({k:v for k, v in flatten(kv)} for kv in data)
#Out
          event properties_page_visited properties_user_id
0  User Clicked              contact_us                123
1  User Clicked                homepage                456
2  User Clicked              restaurant                789

推荐阅读