使用 json_normalize 或 read_json 读取嵌套 json 的 Pandas

问题描述

我有一个具有以下结构的 json object

import pandas as pd
json_data_raw = [{"indicator_value":{"195606": 
                                              {"2010":{"AFG": 0.29,"ZWE": 0.607},"2011": {"AFG": 0.406,"ZWE": 0.737},"2012": {"AFG": 0.345,"ZWE": 0.587},"2013": {"AFG": 0.28,"ZWE": 0.871},"2014": {"AFG": 0.253,"ZWE": 0.88},"2015": {"AFG": 0.262,"2016": {"AFG": 0.245,"ZWE": 0.77},"2017": {"AFG": 0.247,"ZWE": 0.845},"2018": {"AFG": 0.254,"ZWE": 0.849}}},"country_name": {"AFG": "Afghanistan","ZWE": "Zimbabwe"},"indicator_name": {"195606": "Carbon dioxide emissions,production emissions per capita (tonnes)"}}]

当我尝试使用 pd.read_json 方法读取此结构时,我设法仅加载数据的第一个节点,即 "indicator_value""country_name""indicator_name" 以及嵌套的仅实例。

我也尝试使用 pd.json_normalize 也没有成功,因为我不太明白如何指定包含在我的 json object 中的参数 record_path 或 Meta(元数据)并得到奇怪的结果。>

理想情况下,我想要一张这样的桌子。

enter image description here

等其他country/year/values...

可能这不仅仅是一项任务,还会涉及其他类型的对象操作。 无论如何,我非常感谢您的帮助。

解决方法

首先创建一个名为variable的{​​{1}}....基本上它包含了内部的d

dictionary

现在创建一个 d=json_data_raw[0] :-

dataframe df

所以这里 df=pd.DataFrame(list(list(d.values())[0].values())[0]) 有 3 层更深的 list(list(d.values())[0].values())[0]

现在,

dictionary

注意:-在这里您可以覆盖 df=df.stack().to_frame() 或创建一个新的 df 上面的代码创建了一个 variable 以便删除 multi index dataframe 我们使用:-

multi index

现在重命名列:-

df.reset_index(inplace=True)

现在我们将创建一个函数,将 country_code 列更改为国家名称,即

df.columns=['country_code','year','Carbon dioxide emssions,production emission per capita(tonnes)']

现在我们将使用 def country(val): if val=='AFG': return 'Afganistan' else: return 'Zimbabwe' 方法

apply()

现在最后我们将在 country=df['country_code'].apply(country)

中插入 country 列
dataframe df

现在如果你打印 df.insert(0,'country_name',country) 你会得到你想要的输出

输出:-

df

注意:- 好吧,我创建了一个 country_name country_code year Carbon dioxide emssions,production emission per capita(tonnes) 0 Afganistan AFG 2010 0.290 1 Afganistan AFG 2011 0.406 2 Afganistan AFG 2012 0.345 3 Afganistan AFG 2013 0.280 4 Afganistan AFG 2014 0.253 5 Afganistan AFG 2015 0.262 6 Afganistan AFG 2016 0.245 7 Afganistan AFG 2017 0.247 8 Afganistan AFG 2018 0.254 9 Zimbabwe ZWE 2010 0.607 10 Zimbabwe ZWE 2011 0.737 11 Zimbabwe ZWE 2012 0.587 12 Zimbabwe ZWE 2013 0.871 13 Zimbabwe ZWE 2014 0.880 14 Zimbabwe ZWE 2015 0.880 15 Zimbabwe ZWE 2016 0.770 16 Zimbabwe ZWE 2017 0.845 17 Zimbabwe ZWE 2018 0.849 因为在您的 function 对象中只有 2 个国家/地区,如果您的国家/地区超过 2 个并且您有相同的json 格式然后代码 before 我定义/创建 json 照原样工作。

然后而不是制作 function country() 然后使用 function 方法 使用这个:-

apply()

现在,如果您打印 countryinfo=list(json_data_raw[0].values())[1] ,您会得到一个 countryinfo,其中 dictionary 是国家代码,其 keys 是国家名称

values 的输出:-

countryinfo

好吧,在 {'AFG': 'Afghanistan','ZWE': 'Zimbabwe'} 之前,我们正在获取存储在您的 list(json_data_raw[0].values())[1] 中的 "country_name" 的数据,并将其存储在名为国家信息的 json object:- json_data_raw

现在

variable

所以这里基本上我们用 country=df['country_code'].replace(countryinfo.keys(),countryinfo.values()) 的值替换 df['country_code'] 的值,因此它将返回 countryinfo dictionary 的值,我们将 Series 存储在 { {1}} 名为 Series

最后没有我们 variable 列在 country

中的 insert 'country_name'
index 0

现在,如果您打印 df,那么无论您在 dataframe df 中拥有多少个国家/地区,您都将获得所需的输出

df.insert(0,country) 的输出:-

json_data_raw