我有一个这样的数据,我希望将数据写入数据帧中,以便可以将其直接转换为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
的子列,然后是子列的各个值的另一列。
答案 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文件。