json - 如何读取包含许多下级的 pandas 数据帧复杂 JSON 文件
问题描述
我已经浏览过 Stack Overflow 和许多网站,但找不到解决问题的解决方案。我正在尝试通过 pandas 数据框将从多维推理引擎 (AI) 接收到的 JSON 文件转换为 Excel 格式。这个 JSON 文件的结构非常复杂,有很多层次(我不熟悉 JSON 语言)。
这是 JSON 格式:
{
"data": {
"queries": [{
"id": 292,
"**name**": "Data_8",
"queryId": 0,
"values": {
"Entreprise": {
"F1": {
"rule": 1450,
"**value**": "1.000000000000"
}
}
}
}, {
"id": 430,
"name": "Data_9",
"queryId": 1,
"values": {
"Entreprise": {
"F1": {
"rule": 1437,
"value": "N"
}
}
}
}, {
"id": 359,
"**name**": "Data_10",
"queryId": 2,
"values": {
"Entreprise": {
"F1": {
"rule": 876,
"**value**": "O"
}
}
}
}, and so on.
我加载这个文件:
with open(output_JSON) as data_file:
data2= json.load(data_file)
从文件中,我只需要在两列中检索两个字段:名称和对应的值。
数据帧的期望输出是:
name value
0 Data_8 1
1 Data_9 N
2 Data_10 O
感谢您的时间和帮助。
无论如何,请注意并保持安全@家。
来自法国巴黎的问候:)
更新(2/05/2020):文件加载:
with open(output_JSON) as data_file:
data2= json.load(data_file)
然后:
df = pd.DataFrame(data2['data'])
print (df)
返回:
queries
0 {'id': 292, 'name': 'Data_8', 'queryId': 0, 'v...
1 {'id': 430, 'name': 'Data_9', 'queryId': 1, 'v...
2 {'id': 359, 'name': 'Data_10', 'queryId': 2, '...
然后:
df2=df["queries"]
print (df2)
返回完全相同:
0 {'id': 292, 'name': 'Data_8', 'queryId': 0, 'v...
1 {'id': 430, 'name': 'Data_9', 'queryId': 1, 'v...
2 {'id': 359, 'name': 'Data_10', 'queryId': 2, '...
此时我不知道如何在数据框中获取名称和值列。
再次感谢您的时间:)
解决方案
采用json_normalize
- 如果 pandas 版本 < 1,请使用
from pandas.io.json import json_normalize
data2
- 这是我在一个名为的文件中的数据
test.json
{
"data": {
"queries": [{
"id": 292,
"name": "Data_8",
"queryId": 0,
"values": {
"Entreprise": {
"F1": {
"rule": 1450,
"value": "1.000000000000"
}
}
}
}, {
"id": 430,
"name": "Data_9",
"queryId": 1,
"values": {
"Entreprise": {
"F1": {
"rule": 1437,
"value": "N"
}
}
}
}, {
"id": 359,
"name": "Data_10",
"queryId": 2,
"values": {
"Entreprise": {
"F1": {
"rule": 876,
"value": "O"
}
}
}
}
]
}
}
import pandas as pd
from pandas.io.json import json_normalize # not needed for current pandas
from pathlib import Path
import json
# load test.json
p = Path(r'c:\Users\...\test.json')
with p.open('r', encoding='utf-8') as f:
data2 = json.loads(f.read())
# create the dataframe
# df = pd.json_normalize(data2, ['data', 'queries']) # use for modern pandas
df = json_normalize(data2, ['data', 'queries'])
df.rename(columns={'values.Entreprise.F1.value': 'value'}, inplace=True)
df2 = df[['name', 'value']].copy()
print(df)
id name queryId values.Entreprise.F1.rule value queries.name
0 292 Data_8 0 1450 1.000000000000 NaN
1 430 Data_9 1 1437 N NaN
2 359 Data_10 2 876 O NaN
print(df2)
name value
0 Data_8 1.000000000000
1 Data_9 N
2 Data_10 O
推荐阅读
- python-3.x - pandas df:如果不存在则添加列,将值从dict添加到新列
- c++ - 检查枚举类是否可用的简单宏
- android - 我无法在 Android Studio 中编译 Github 代码(同步失败,出现 5 个错误)
- c# - Xunit () 中的测试异常
- coq - Coq中的Peano算术
- c# - 精灵渲染器在 Unity 2D 中颜色变化时保持白色
- java - 使用父类、接口或子类创建新对象?
- excel - 在 Excel 中使用 vba 填充行 x 列设计的表
- r - write_csv - 导出尾随空格(不消除)
- android - 如何拥有 android:background 颜色并仍然保留 Android 中列表的灰色焦点突出显示?