[英]Pandas Dataframe to Nested JSON
我正在嘗試將Pandas Dataframe轉換為JSON對象。 我的Dataframe包含以下格式的數據:
student date grade course
0 Student_1 2017-06-25 93 ENGLISH
1 Student_2 2017-06-25 83 ENGLISH
2 Student_1 2017-06-25 93 MATH
3 Student_2 2017-06-25 83 MATH
4 Student_1 2017-06-26 90 MATH
5 Student_2 2017-06-26 85 MATH
6 Student_1 2017-06-26 96 ENGLISH
7 Student_2 2017-06-26 99 ENGLISH
我想以下列格式將其轉換為JSON對象:
[
{'ENGLISH': [
{
'date' : '2017-06-25',
'Student_1' : 93,
'Student_2' : 83
},
{
'date' : '2017-06-26',
'Student_1' : 96,
'Student_2' : 89
}]
},
{'MATH': [
{
'date' : '2017-06-25',
'Student_1' : 93,
'Student_2' : 83
},
{
'date' : '2017-06-26',
'Student_1' : 90,
'Student_2' : 85
}]
}
]
一個簡單的.to_json()
調用對我來說不起作用。 無論如何我可以在Pandas中以所需的格式創建JSON對象嗎?
您可以先定義一個函數將子組轉換為json,然后將此函數應用於每個組,然后將子組jsons合並到一個json對象。
def f(x):
return (dict({'date':x.date.iloc[0]},**{k:v for k,v in zip(x.student,x.grade)}))
(
df.groupby(['course','date'])
.apply(f)
.groupby(level=0)
.apply(lambda x: x.tolist())
.to_dict()
)
Out[1006]:
{'ENGLISH': [{'Student_1': 93, 'Student_2': 83, 'date': '2017-06-25'},
{'Student_1': 96, 'Student_2': 99, 'date': '2017-06-26'}],
'MATH': [{'Student_1': 93, 'Student_2': 83, 'date': '2017-06-25'},
{'Student_1': 90, 'Student_2': 85, 'date': '2017-06-26'}]}
試試看:
file.csv :
student,date,grade,course
0,Student_1,2017-06-25,93,ENGLISH
1,Student_2,2017-06-25,83,ENGLISH
2,Student_1,2017-06-25,93,MATH
3,Student_2,2017-06-25,83,MATH
4,Student_1,2017-06-26,90,MATH
5,Student_2,2017-06-26,85,MATH
6,Student_1,2017-06-26,96,ENGLISH
7,Student_2,2017-06-26,99,ENGLISH
執行:
from collections import defaultdict
import json
import pandas as pd
df = pd.read_csv('file.csv')
json_doc = defaultdict(list)
for _id in df.T:
data = df.T[_id]
key = data.course
for elt in json_doc[key]:
if elt["date"] == data.date:
elt[data.student] = data.grade
break
else:
values = {'date': data.date, data.student: data.grade}
json_doc[key].append(values)
print(json.dumps(json_doc, indent=4))
輸出:
{
"ENGLISH": [
{
"date": "2017-06-25",
"Student_1": 93,
"Student_2": 83
},
{
"date": "2017-06-26",
"Student_1": 96,
"Student_2": 99
}
],
"MATH": [
{
"date": "2017-06-25",
"Student_1": 93,
"Student_2": 83
},
{
"date": "2017-06-26",
"Student_1": 90,
"Student_2": 85
}
]
}
如果您首先在DataFrame
有多個索引並且執行myDataframe.to_dict(orient='index')
那么它將創建一個字典,其中key=tuple
和value="the remaining non-indexed columns"
。
您可以簡單地創建一個遞歸函數,該函數將創建一個dict
,其嵌套為tuple
鍵中元素的數量,如下所示:
def recurse(test):
lentpl=len(list(test.keys())[0])
if lentpl==2:
return {k[0]:{k[1]:v} for k,v in test.items()}
else:
test2={k[0:-1]:{k[-1]:v} for k,v in test.items()}
return recurse(test2)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.