熊猫数据框到嵌套 JSON
Posted
技术标签:
【中文标题】熊猫数据框到嵌套 JSON【英文标题】:Pandas Dataframe to Nested JSON 【发布时间】:2017-11-28 18:00:29 【问题描述】:我正在尝试将 Pandas 数据框转换为 JSON 对象。我的数据框包含以下格式的数据:
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 对象吗?
【问题讨论】:
【参考方案1】:你可以先定义一个函数将子组转换为json,然后将此函数应用到每个组,然后将子组json合并为单个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']
【讨论】:
【参考方案2】:试试看:
文件.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
]
【讨论】:
【参考方案3】:如果您首先在您的 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)
【讨论】:
以上是关于熊猫数据框到嵌套 JSON的主要内容,如果未能解决你的问题,请参考以下文章