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_pathmeta,但它一直给我一个错误。

你是如何做到这一点的?

【问题讨论】:

【参考方案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 展平嵌套字典的主要内容,如果未能解决你的问题,请参考以下文章

pandas json_normalize 所有列都有嵌套字典展平

使用 pd.json_normalize 展平字典

展平 JSON 响应

在python中展平JSON数据框

Pandas json_normalize 的逆

如何防止 json_normalize 在 Pandas 中重复列标题?