如何读入 pandas 数据框复杂 JSON 包含许多下层的文件

How to read in pandas dataframe complex JSON files containing many down levels

我已经浏览过 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,在两列中。

数据帧的期望输出是:

              name            value
   0          Data_8            1
   1          Data_9            N
   2          Data_10           O 

感谢您的宝贵时间和帮助。

无论如何,保重并注意安全@家。

来自法国巴黎的问候:)

更新(2020 年 5 月 2 日): 文件加载为:

with open(output_JSON) as data_file:    
             data2= json.load(data_file)

然后:

df = pd.DataFrame(data2['data'])
print (df)

returns:

                                              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)

returns 完全一样:

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