首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Pandas Dataframe to Nested

Pandas Dataframe to Nested
EN

Stack Overflow用户
提问于 2017-06-26 04:53:12
回答 3查看 9.2K关注 0票数 10

我正在尝试将Pandas Dataframe转换为JSON对象。My Dataframe包含以下格式的数据:

代码语言:javascript
复制
         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对象:

代码语言:javascript
复制
[
    {'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对象?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2017-06-26 05:20:02

您可以先定义一个将子组转换为json的函数,然后将该函数应用于每个组,然后将子组json合并为一个json对象。

代码语言:javascript
复制
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'}]}
票数 12
EN

Stack Overflow用户

发布于 2017-06-26 05:38:51

试一试:

file.csv

代码语言:javascript
复制
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

执行:

代码语言:javascript
复制
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))

输出:

代码语言:javascript
复制
{
    "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
        }
    ]
}
票数 2
EN

Stack Overflow用户

发布于 2019-09-07 02:23:46

如果您的DataFrame中首先有多个索引,并且执行了myDataframe.to_dict(orient='index'),那么它将在key=tuplevalue="the remaining non-indexed columns"的位置创建一个字典。

您可以简单地创建一个递归函数,该函数将创建一个与tuple键中的元素数量一样嵌套的dict,如下所示:

代码语言:javascript
复制
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)
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44750514

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档