首页 > 解决方案 > 如何读取包含许多下级的 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, '...

此时我不知道如何在数据框中获取名称和值列。

再次感谢您的时间:)

标签: jsonpython-3.xpandasdataframejson-normalize

解决方案


采用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

推荐阅读