用于读取嵌套json和json\u规范化或读取\u json的熊猫

用于读取嵌套json和json\u规范化或读取\u json的熊猫,json,pandas,dataframe,normalize,Json,Pandas,Dataframe,Normalize,我有一个结构如下的json对象: import pandas as pd json_data_raw = [{"indicator_value":{"195606": {"2010":{"AFG": 0.29, &

我有一个结构如下的
json对象

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, 
                                                       "ZWE": 0.88}, 
                                               "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\u json
方法读取此结构时,我只加载数据的第一个节点,即
“indicator\u value”
“country\u name”
“indicator\u name”
,并且只加载嵌套实例

我还尝试使用
pd.json\u normalize
,但都没有成功,因为我不太明白如何指定
json对象中包含的参数record\u path或meta(metadata),并得到奇怪的结果

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

其他
国家/年/值…依此类推。

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

首先创建一个名为
d
变量
…基本上它包含内部
字典

d=json_data_raw[0]
现在创建一个数据帧df
:-

df=pd.DataFrame(list(list(d.values())[0].values())[0])
    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
所以这里的
list(list(d.values())[0].values())[0]
有三个更深层次的
dictionary

d=json_data_raw[0]
现在,

注意:-这里您可以覆盖
df
或创建新的
变量
上述代码构成了一个
多索引数据帧
,因此要删除
多索引
,我们使用:-

df.reset_index(inplace=True)
现在要重命名列:-

df.columns=['country_code','year','Carbon dioxide emssions,production emission per capita(tonnes)']
现在我们将创建一个函数,将country_code列更改为country name,即

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

country=df['country_code'].apply(country)
现在,我们将在我们的
数据帧df

df.insert(0,'country_name',country)
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
注意:-我创建了一个
函数
,因为在你的
json
对象中只有两个国家,如果你有两个以上的国家,并且你有相同的
json
格式,那么我定义/创建
函数国家()
之前的代码就按原样工作

但是,不要使用
函数
然后使用
apply()
方法 使用以下命令:-

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

国家信息的输出:-

{'AFG': 'Afghanistan', 'ZWE': 'Zimbabwe'}
通过
列表(json\u data\u raw[0].values())[1]
我们正在获取
国家名称的数据,该数据存储在您的
json对象中:-json\u data\u raw
并将其存储在名为country info的
变量中

所以现在

country=df['country_code'].replace(countryinfo.keys(),countryinfo.values())
因此,这里基本上我们将
df['country\u code']
的值替换为
countryinfo dictionary
的值,因此它将返回一个
系列
的值,我们将
系列
存储在
变量
命名的
国家

最后,在我们的
数据帧df

df.insert(0,'country_name',country)
df.insert(0,'country_name',country)
现在,如果您打印df,那么无论您的
json\u data\u raw中有多少个国家,您都将获得所需的输出

df的输出
:-

df=pd.DataFrame(list(list(d.values())[0].values())[0])
    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

嘿,鲁本,你能以表格的形式发布你想要的结果吗?这使得其他人更容易阅读您的问题。原则上,我想添加所需的表格作为插入图像,但显然这是不允许的。他们只给了我发布链接的选项:/第一次发布,你知道。。。我是纽比。但是谢谢你的反馈。这正是我需要的。非常感谢@anurag dabas!!!再加上详细的解释。例如,如果您不知道生成国家名称的函数中@Anurag的国家数,您会如何概括?@Ruben Lopez我在我的答案中添加了您问题的答案……所以请看一看