熊猫数据框到嵌套 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=tuplevalue="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的主要内容,如果未能解决你的问题,请参考以下文章

具有多个键的熊猫数据框到 json

多索引熊猫数据框到字典

熊猫数据框到字典

熊猫数据框到 csv 导出问题

从火花数据框到熊猫数据框

从熊猫数据框到以n维数组为特征的数据框