pandas json_normalize 展平嵌套字典
Posted
技术标签:
【中文标题】pandas json_normalize 展平嵌套字典【英文标题】:pandas json_normalize flatten nested dictionaries 【发布时间】:2019-11-15 23:19:32 【问题描述】:我正在尝试使用 json_normalize
来展平嵌套字典。
我的数据是这样的:
data = [
'gra': [
'A': 1,
'B': 9,
'C': 'D': '1', 'E': '1',
'date': '2019-06-27'
],
'gra': [
'A': 2,
'B': 1,
'C': 'D': '1', 'E': '2',
'date': '2019-06-27'
],
'gra': [
'A': 6,
'B': 1,
'C': 'D': '1', 'E': '3',
'date': '2019-06-27'
]
]
我想得到这样的数据框:
A B C.D C.E date
1 9 1 1 2019-06-27
2 1 1 2 2019-06-27
6 1 1 3 2019-06-27
我在json_normalize
中尝试了record_path
和meta
,但它一直给我一个错误。
你是如何做到这一点的?
【问题讨论】:
【参考方案1】:json_normalize 在将对象扁平化为 熊猫数据框:
from pandas.io.json import json_normalize json_normalize(sample_object)
from pandas.io.json import json_normalize
data_ = [item['gra'][0] for item in data] # ['A': 1, 'B': 9, 'C': 'D': '1', 'E': '1', 'date': '2019-06-27', 'A': 2, 'B': 1, 'C': 'D': '1', 'E': '2', 'date': '2019-06-27', 'A': 6, 'B': 1, 'C': 'D': '1', 'E': '3', 'date': '2019-06-27']
print (json_normalize(data_))
输出:
A B C.D C.E date
0 1 9 1 1 2019-06-27
1 2 1 1 2 2019-06-27
2 6 1 1 3 2019-06-27
【讨论】:
【参考方案2】:迭代列表是最简单的方法,但不能说是最好的方法。
希望能解决你的问题
data = ['gra':['A': 1,
'B': 9,
'C': 'D': '1', 'E': '1',
'date': '2019-06-27'],
'gra':['A': 2,
'B': 1,
'C': 'D': '1', 'E': '2',
'date': '2019-06-27'],
'gra':['A': 6,
'B': 1,
'C': 'D': '1', 'E': '3',
'date': '2019-06-27']
]
final_list =[]
for i in data:
temp = dict()
temp['A'] = i['gra'][0]['A']
temp['B'] = i['gra'][0]['B']
temp['C.D'] = i['gra'][0]['C']['D']
temp['C.E'] = i['gra'][0]['C']['E']
temp['date']=i['gra'][0]['date']
final_list.append(temp)
df = pd.DataFrame.from_dict(final_list)
print(df)
A B C.D C.E date
0 1 9 1 1 2019-06-27
1 2 1 1 2 2019-06-27
2 6 1 1 3 2019-06-27
【讨论】:
【参考方案3】:首先我们进行规范化,然后破解我们的方式以产生所需的输出
import pandas as pd
data = [
'gra': [
'A': 1,
'B': 9,
'C': 'D': '1', 'E': '1',
'date': '2019-06-27'
],
'gra': [
'A': 2,
'B': 1,
'C': 'D': '1', 'E': '2',
'date': '2019-06-27'
],
'gra': [
'A': 6,
'B': 1,
'C': 'D': '1', 'E': '3',
'date': '2019-06-27'
]
]
df = pd.json_normalize(data, 'gra')
cols = ['A','B','C.D','C.E','date']
df = df[cols]
print(df)
A B C.D C.E date
0 1 9 1 1 2019-06-27
1 2 1 1 2 2019-06-27
2 6 1 1 3 2019-06-27
[Program finished]
【讨论】:
以上是关于pandas json_normalize 展平嵌套字典的主要内容,如果未能解决你的问题,请参考以下文章