2017-06-25 25 views
3

Pandas DataframeをJSONオブジェクトに変換しようとしています。私のデータフレームは、次の形式でデータが含まれていますPandas Dataframeとネスト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オブジェクトを作成できますか?

答えて

5

最初に、サブグループをjsonに変換してから、各グループにこの関数を適用し、サブグループjsonsを1つの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'}]} 
+0

ありがとうございました!これは動作します:) –

1

それを試してみてください。

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 
     } 
    ] 
}