【问题标题】:Pandas for reading nested json with json_normalize or read_json使用 json_normalize 或 read_json 读取嵌套 json 的 Pandas
【发布时间】:2021-05-24 22:20:12
【问题描述】:

我有一个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, 
                                                       "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_json 方法读取此结构时,我设法仅加载数据的第一个节点,即"indicator_value""country_name""indicator_name",仅包含嵌套实例。

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

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

其他country/year/values...以此类推

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

【问题讨论】:

  • 嗨 ruben,您能以表格格式发布所需的结果吗?这让其他人更容易阅读您的问题。
  • 原则上我想将所需的表添加为插入的图像,但显然这是不允许的。他们只给了我发布链接的选项:/ 第一篇文章,你知道... newby here。但感谢您的反馈。

标签: json pandas dataframe normalize


【解决方案1】:

首先创建一个名为dvariable....基本上它包含了内部dictionary

d=json_data_raw[0]

现在创建一个dataframe df:-

df=pd.DataFrame(list(list(d.values())[0].values())[0])

所以这里 list(list(d.values())[0].values())[0] 有 3 级更深 dictionary

现在,

df=df.stack().to_frame()

注意:-在这里您可以覆盖df 或创建一个新的variable 上面的代码创建了一个multi index dataframe,所以要删除multi index,我们使用:-

df.reset_index(inplace=True)

现在重命名列:-

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

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

def country(val):
    if val=='AFG':
        return 'Afganistan'
    else:
        return 'Zimbabwe'

现在我们将使用apply() 方法

country=df['country_code'].apply(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,因为在您的 json 对象中只有 2 个国家/地区,如果您的国家/地区超过 2 个并且您具有相同的 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 的值,我们将Series 存储在名为variablecountry

最后没有我们insert 'country_name'index 0dataframe df 中的列

df.insert(0,'country_name',country)

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

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

【讨论】:

  • 这正是我所需要的。非常感谢@anurag-dabas!!!加上详细的解释。
  • 如果您不知道生成国家名称的函数中@Anurag 的国家数量,您将如何概括?
  • @Ruben Lopez 我在我的回答中添加了你的问题的答案.....所以看看
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-07-21
  • 2022-07-10
  • 2018-01-07
  • 2019-05-24
  • 2019-02-12
  • 2019-04-11
  • 2019-10-31
相关资源
最近更新 更多