DataFrame词典列表

时间:2018-07-19 08:34:56

标签: python list pandas dictionary 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_id, page_visited, contact_us的子列,然后是子列的各个值的另一列。

2 个答案:

答案 0 :(得分:2)

展平嵌套字典,然后仅使用数据框构造函数创建一个数据框。

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

可以用几种方法构造扁平化字典。这是一种使用通用生成器的方法,该生成器可与任意深度的嵌套字典一起使用(或至少直到达到最大递归深度为止)

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

答案 1 :(得分:0)

您有2个选择:对列使用MultiIndex,或为properties中的数据添加前缀。我认为前一种方法在这里不合适,因为您没有“真正的”分层列结构。例如,第二级对于event将为空。

为实现第二个想法,您可以在输入pd.DataFrame之前重组字典列表。语法{**d1, **d2}用于组合两个字典。

data_transformed = [{**{'event': d['event']},
                     **{f'properties_{k}': v for k, v in d['properties'].items()}} \
                    for d in Data]

res = pd.DataFrame(data_transformed)

print(res)

          event properties_page_visited properties_user_id
0  User Clicked              contact_us                123
1  User Clicked                homepage                456
2  User Clicked              restaurant                789

这还有助于在MultiIndex可能不明确的地方写入和读取CSV文件。