【问题标题】:Pandas Dataframe to Nested JSON熊猫数据框到嵌套 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 对象吗?

【问题讨论】:

    标签: python json pandas dataframe


    【解决方案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)
        

        【讨论】:

          猜你喜欢
          • 2021-12-23
          • 1970-01-01
          • 1970-01-01
          • 2023-03-23
          • 2018-04-14
          • 1970-01-01
          • 2022-07-06
          • 1970-01-01
          相关资源
          最近更新 更多