如何将多个json节(全部在一个文件中)导入到python/pandas中
我正在尝试处理一个json文件,以便在另一个将使用excel文件的程序中使用。我的json文件有多个节/数组,其中一个用于存储一些基本信息,如记录数、报告名。它有用于列名的节/数组,然后是另一个将每一行/记录作为数组的节/数组 我曾尝试使用pandas.read_json和json_加载选项来读取中的数据,但不断出现错误。如果我删除了除一个(如行)部分之外的所有部分,我可以让它读入(尽管它将所有列放在一列中,就像它没有将每个用逗号分隔的列名标识为单独的列一样) 理想情况下,我不需要手动编辑此文件,只需在python中将其处理为pandas数据帧,这样我就可以进一步操作它并将其导出以供其他使用 任何帮助都将不胜感激。这是我的第一篇帖子,如果有什么我能做得更好的,请告诉我 这里是json数据的表示,实际数据有更多的列和更多的行/记录(通常为700多条) 我试图让columnNames部分成为pandas数据框架中的列名,并使每个“行”成为数据框架中的记录 我试过看其他的例子,但是我没有遇到类似的json格式的问题 我尝试过使用pandas.read_json(“example.json”)和json.loads来加载数据,但它们都会出现不同的错误,我似乎无法避免 运行pandas.read_json(“example.json”)时,它会返回“数组的长度必须相同”如何将多个json节(全部在一个文件中)导入到python/pandas中,python,json,python-3.x,pandas,json-normalize,Python,Json,Python 3.x,Pandas,Json Normalize,我正在尝试处理一个json文件,以便在另一个将使用excel文件的程序中使用。我的json文件有多个节/数组,其中一个用于存储一些基本信息,如记录数、报告名。它有用于列名的节/数组,然后是另一个将每一行/记录作为数组的节/数组 我曾尝试使用pandas.read_json和json_加载选项来读取中的数据,但不断出现错误。如果我删除了除一个(如行)部分之外的所有部分,我可以让它读入(尽管它将所有列放在一列中,就像它没有将每个用逗号分隔的列名标识为单独的列一样) 理想情况下,我不需要手动编辑此文件
结果应该是columnNames节/数组应该是pandas数据帧的列名,然后是我希望成为数据帧中记录的每一行。我将给出一般方法,我认为您可以在此基础上进行构建
- 创建具有三个虚拟列名的数据帧
- 根据需要插入所有行
- 使用json的
段重命名列columnNames
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)
使用pd.json\u normalize
:解压缩json
文件
输出:
columnNames count name rows
0 [Incident ID, Status, Subject] 2 report1 [[2460636, Resolved, login help], [2460637, Un...
解包行
:
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_行的输出
:
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"
}
]
}
我会看看我是否能做到这一点。我遇到的部分问题是让Python将json文件作为对象导入,然后我可以从中获取特定的节数据。我可以将文件作为字符串数据导入,但不确定如何将特定节段(如行或列节数据)填充到数据框中。谢谢,我正在查看g现在就看这个。有没有办法不使用json数据在python中创建dict,让它从一个文件读入dict?我将通过对oracle报告的API调用来获取这个json数据,所以我可能不需要从一个文件中读取,但希望在我尝试获取该文件的其他部分时验证它是否正常工作。错误I当我试图将这个json文件传递给dict变量时,get是“'str'对象没有属性'get'”哦,是的,你必须在json文件中读取
json”包。这将创建一个与你展示的字典类似的字典。你可以看到一个[示例](https://stackabuse.com/reading-and-writing-json-to-a-file-in-python),或阅读
json`。太棒了,谢谢!我更新了我的代码,并将其扩展到包含整个json文件,它现在可以工作了,并且在一个熊猫数据框架中。谢谢!你帮了我很大的忙。
Incident ID Status Subject name
0 2460636 Resolved login help report1
1 2460637 Unresolved email help report1
{
"count": 2,
"name": "report1",
"rows": [{
"Incident ID": "2460636",
"Status": "Resolved",
"Subject": "login help"
}, {
"Incident ID": "2460637",
"Status": "Unresolved",
"Subject": "email help"
}
]
}