如何将以下 JSON(深度嵌套)加载到 DataFrame?

Posted

技术标签:

【中文标题】如何将以下 JSON(深度嵌套)加载到 DataFrame?【英文标题】:How can I load the following JSON (deeply nested) to a DataFrame? 【发布时间】:2021-01-08 17:28:54 【问题描述】:

JSON 示例如下所示:


  "AN": 
    "dates": 
      "2020-03-26": 
        "delta": 
          "confirmed": 1
        ,
        "total": 
          "confirmed": 1
        
      
     
    ,
    
    "KA": 
        "dates": 
          "2020-03-09": 
            "delta": 
                "confirmed": 1
        ,
        "total": 
          "confirmed": 1
        
      ,
      "2020-03-10": 
        "delta": 
          "confirmed": 3
        ,
        "total": 
          "confirmed": 4
        
      
     
    

我想将它加载到 DataFrame 中,以便将状态名称(AN、KA)表示为行名称,并将日期和嵌套条目表示为列。

非常感谢任何实现此目的的提示。 [我知道 json_normalize,但是我还没有弄清楚如何解决它。]

我期待的输出,大致如下图:

【问题讨论】:

【参考方案1】:

你能用你想到的 DataFrame 更新你的帖子吗?更容易理解你想要什么。

此外,如果您无法使其以现在的方式工作,有时最好重塑您的数据。

更新:

根据您的更新,您可以执行以下操作。

您需要重塑数据,正如我所说,当您无法实现您想要的结果时,最好从另一个角度看待问题。例如(从您共享的示例中)“日期”键是没有意义的,因为其他键已经是日期,并且没有其他键处于同一级别。 使用MultiIndex 是实现您想要的一种方法,它可以帮助您按照您想要的方式对数据进行分组。例如,要使用它,您可以创建所需的所有索引并将相关值存储在字典中。

示例:

如果您拥有的唯一索引是('2020-03-26', 'delta', 'confirmed'),您应该拥有values = 'AN' : [1], 'KA':None

那么你只需要创建你的DataFrame并转置它。

我快速尝试了一下,并想出了一段应该可以工作的代码。如果您正在寻找性能,我认为这不会成功。

import pandas as pd

# d is the sample you shared

index = [[],[],[]]
values = 
# Get all the dates
dates = [date for c in d.keys() for date in d[c]['dates'].keys() ]

for country in d.keys():
    # For each country we create an array containing all 6 values for each date
    # (missing values as None)
    values[country] = []
    for date in dates:
        if date in d[country]['dates']:
            for method in ['delta', 'total']:
                for step in ['confirmed', 'recovered', 'tested']:
                    # Incrementing indices 
                    index[0].append(date)
                    index[1].append(method) 
                    index[2].append(step)
                    if step in value.keys():
                        values[country].append(deepcopy(d[country]['dates'][date][method][step]))
                    else : 
                        values[country].append(None)
        # When country does not have a date fill with None
        else : 
            for method in ['delta', 'total']:
                for step in ['confirmed', 'recovered', 'tested']:
                    index[0].append(date)
                    index[1].append(method) 
                    index[2].append(step)
                    values[country].append(None)

# Removing duplicates introduced because we added n_countries times
# the indices 
# 3 is the number of steps
# 2 is the number of methods

number_of_rows = 3*2*len(dates)
index[0] = index[0][:number_of_rows]
index[1] = index[1][:number_of_rows]
index[2] = index[2][:number_of_rows]

df = pd.DataFrame(values, index=index).T

这是我输出的转置数据框的内容:

希望对你有帮助

【讨论】:

是的,按要求添加。【参考方案2】:

您显然需要在将 json 数据加载到 DataFrame 之前对其进行整形。 你试过像字典一样加载你的 json 吗?

dataframe = pd.DataFrame.from_dict(JsonDict, orient="index")

数据的“方向”。如果传递的 dict 的键应该是结果 DataFrame 的列,则传递“columns”(默认)。否则,如果键应该是行,则传递“索引”。

【讨论】:

于是我试了一下,输出如下: dates AN '2020-03-26': 'delta': 'confirmed': 1, 'to... AP '2020-03-12': 'delta': 'confirmed': 1, 'to... AR '2020-04-02': 'delta': 'confirmed': 1 , 'to... 有没有办法重塑列,以便我可以正确存储条目?现在,状态名称正确显示为行,但是有一个名为日期的列,其中包含所有条目(加上格式不正确,它存储为 dict 键和值) 看这里-> ***.com/questions/24988131/…

以上是关于如何将以下 JSON(深度嵌套)加载到 DataFrame?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用嵌套列表和字典加载JSON对象?

如何获取嵌套 JSON 值并将其加载到 Tableview Objective c 中?

在特定对象级别将 pandas DataFrame 中的列添加到深度嵌套的 JSON 中

使用 Javascript 将 JSON 嵌套到编号 HTML 表

如何使用 SwiftyJSON 从深度嵌套的 JSON 字典中获取字符串 [重复]

多层次查询深度嵌套复杂的 JSON 数据