用于读取嵌套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我在我的答案中添加了您问题的答案……所以请看一看