0

我正在尝试处理一个 json 文件以用于另一个将使用 excel 文件的程序。我的 json 文件有多个部分/数组,一个用于一些基本信息,如记录数、报告名称。它有用于列名的部分/数组,然后是另一个将每个单独的行/记录作为数组的部分/数组。

我尝试使用 pandas.read_json 和 json_loads 选项来读取数据,但我不断收到错误。如果我删除除一个(如行)部分之外的所有部分,我可以让它读取它(尽管它将所有列放在一列中,就像它没有将用逗号分隔的每个列名标识为单独的列一样。

理想情况下,我不想手动编辑此文件,只需在 python 中将其处理为 pandas 数据框,以便我可以进一步操作它并将其导出以供其他用途。

任何帮助将不胜感激。这是我的第一篇文章,所以如果有什么我可以做的更好,请告诉我!

这是 json 数据的表示,实际数据有更多的列和更多的行/记录(通常为 700+)

{
"count": 2,
"name": "report1",
"columnNames": [
    "Incident ID",
    "Status",
    "Subject"
],
"rows": [
    [
        "2460636",
        "Resolved",
        "login help"
    ],
    [
        "2460637",
        "Unresolved",
        "email help"
    ]
    ]
}

我试图让 columnNames 部分成为熊猫数据框中的列名,并且每个“行”成为数据框中的一条记录。

我已经尝试查看其他示例,但我没有遇到像这样格式化的 json 的类似问题。

我尝试使用 pandas.read_json("example.json") 以及 json.loads 来加载数据以获取数据,但它们都出现了我似乎无法解决的不同错误。

运行 pandas.read_json("example.json") 时,它会返回说“数组必须都是相同的长度”。

结果应该是 columnNames 部分/数组应该是 pandas 数据框的列名,然后每个“行”我想成为数据框中的记录。

4

3 回答 3

0

因为我没有看到您的完整 json 文件,所以我不知道这是否会完成您需要做的所有事情,但是根据您的测试数据,这确实会使用来自 json 格式字典的数据创建一个 pandas df。

import pandas as pd

test_dict={
    "count": 2,
    "name": "report1",
    "columnNames": [
        "Incident ID",
        "Status",
        "Subject"
    ],
    "rows": [
        [
            "2460636",
            "Resolved",
            "login help"
        ],
        [
            "2460637",
            "Unresolved",
            "email help"
        ]
        ]
    }

def make_df(json_dat): #use this function every time you want to make new df from json
    indicent_id=[]
    status=[]
    subject=[]

    for row in json_dat.get('rows'): #loop for all rows in df and append data to lists
        indicent_id.append(row[0])
        status.append(row[1])
        subject.append(row[2])

    #create pandas df from data
    df=pd.DataFrame([indicent_id, status, subject],
                    index=['indicent_id', 'status', 'subject']).T

    return df

#you can call the function now every time you need to make a df, potentially generating a dictionary of dfs based on the name of the json files 

df1= make_df(test_dict)
于 2019-07-30T19:24:16.923 回答
0

使用pd.json_normalize: 解压你的json文件

pd.json_normalize

import pandas as pd
import json

with open('test.json') as f:
    data = json.load(f)

json_data = pd.json_normalize(data)

输出:

                       columnNames  count  name                            rows
0   [Incident ID, Status, Subject]  2   report1 [[2460636, Resolved, login help], [2460637, Un...

拆包rows

df_rows = pd.json_normalize(data, record_path=['rows'], meta=['name'])
df_rows.rename({0: data['columnNames'][0],
                1: data['columnNames'][1],
                2: data['columnNames'][2]}, axis=1, inplace=True) 

输出df_row

     Incident ID        Status       Subject       name
0        2460636      Resolved    login help    report1
1        2460637    Unresolved    email help    report1

json不是特别好,像下面这样更容易解压:

{
    "count": 2,
    "name": "report1",
    "rows": [{
            "Incident ID": "2460636",
            "Status": "Resolved",
            "Subject": "login help"
        }, {
            "Incident ID": "2460637",
            "Status": "Unresolved",
            "Subject": "email help"
        }
    ]
}
于 2019-07-30T19:34:05.617 回答
-1

我将为您提供一般方法,我认为您可以在此基础上再接再厉。

  • 创建具有三个虚拟列名的 pandas 数据框
  • 根据您的要求插入所有行。
  • columnNames使用json 段重命名列。
于 2019-07-30T18:57:52.060 回答