熊猫json_normalize拼合嵌套字典

时间:2019-07-05 10:15:25

标签: json python-3.x pandas

我正在尝试使用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

我在record_path中尝试过metajson_normalize,但是它总是给我一个错误。

您如何实现这一目标?

3 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

这是迭代列表的最简单方法,但不能说这是最佳方法。

我希望它能解决您的问题

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

答案 2 :(得分:0)

首先我们标准化,然后修改我们的方式来产生所需的输出

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]