如何将以下 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 值并将其加载到 Tableview Objective c 中?
在特定对象级别将 pandas DataFrame 中的列添加到深度嵌套的 JSON 中
使用 Javascript 将 JSON 嵌套到编号 HTML 表