2016-02-02 4 views
1

Я новичок в форматированных файлах JSON.DataFrame для вложенных JSON

У меня есть Панды DataFrame:

import pandas as pd 

df = pd.DataFrame([["A", "2014/01/01", "2014/01/02", "A", -0.0061, "A"], 
        ["A", "2015/07/11", "2015/08/21", "A", 1.50, "A"], 
        ["C", "2016/01/01", "2016/01/05", "U", 2.75, "R"], 
        ["D", "2013/05/19", "2014/09/30", "Q", -100.0, "N"], 
        ["B", "2015/08/22", "2015/09/01", "T", 10.0, "R"]], 
        columns=["P", "Start", "End", "Category", "Value", "Group"] 
       ) 

Это выглядит как этот

P  Start   End Category  Value Group 
0 A 2014/01/01 2014/01/02  A -0.0061  A 
1 A 2015/07/11 2015/08/21  A 1.5000  A 
2 C 2016/01/01 2016/01/05  U 2.7500  R 
3 D 2013/05/19 2014/09/30  Q -100.0000  N 
4 B 2015/08/22 2015/09/01  T 10.0000  R 

Я знаю, что я мог бы преобразовать это в JSON с помощью:

df.to_json("output.json") 

Но мне нужно для преобразования его в вложенный формат JSON следующим образом:

{ 
    "group_list": [ 
    { 
     "category_list": [ 
     { 
      "category": "A", 
      "p_list": [ 
      { 
       "p": "A", 
       "date_list": [ 
       { 
        "start": "2014/01/01", 
        "end": "2014/01/02", 
        "value": "-0.0061" 
       } 
       ] 
      }, 
      { 
       "p": "A", 
       "date_list": [ 
       { 
        "start": "2015/07/11", 
        "end": "2015/08/21", 
        "value": "1.5000" 
       } 
       ] 
      } 
      ] 
     } 
     ], 
     "group": "A" 
    }, 
    { 
     "category_list": [ 
     { 
      "category": "U", 
      "p_list": [ 
      { 
       "p": "C", 
       "date_list": [ 
       { 
        "start": "2016/01/01", 
        "end": "2016/01/05", 
        "value": "2.7500" 
       } 
       ] 
      } 
      ] 
     }, 
     { 
      "category": "T", 
      "p_list": [ 
      { 
       "p": "B", 
       "date_list": [ 
       { 
        "start": "2015/08/22", 
        "end": "2015/09/01", 
        "value": "10.000" 
       } 
       ] 
      } 
      ] 
     } 
     ], 
     "group": "R" 
    }, 
    { 
     "category_list": [ 
     { 
      "category": "Q", 
      "p_list": [ 
      { 
       "p": "D", 
       "date_list": [ 
       { 
        "start": "2013/05/19", 
        "end": "2014/09/30", 
        "value": "-100.0000" 
       } 
       ] 
      } 
      ] 
     } 
     ], 
     "group": "N" 
    } 
    ] 
} 

Я рассмотрел возможность использования функции Pandas 'groupby, но я не могу понять, как я мог бы получить ее в финальном формате JSON. По сути, вложенность начинается с группировки строк с теми же столбцами «группа» и «категория». Впоследствии это вопрос вывода строк. Я мог бы написать код с вложенными петлями, но я надеюсь, что есть более эффективный способ этого.

Update

Я также могу управлять моей DataFrame через:

df2 = df.set_index(['Group', 'Category', 'P']).stack() 

Group Category P  
    A  A   A Start 2014/01/01 
         End  2014/01/02 
         Value  -0.0061 
         Start 2015/07/11 
         End  2015/08/21 
         Value   1.5 
    R  U   C Start 2016/01/01 
         End  2016/01/05 
         Value   2.75 
    N  Q   D Start 2013/05/19 
         End  2014/09/30 
         Value   -100 
    R  T   B Start 2015/08/22 
         End  2015/09/01 
         Value   10 

что близко к где я должен быть, но я не думаю, что можно было бы назвать df2.to_json() в этом случае.

ответ

2

Ниже вложенного цикла вы должны получить довольно близко:

import json 
from json import dumps 

json_dict = {} 
json_dict['group_list'] = [] 
for grp, grp_data in df.groupby('Group'): 
    grp_dict = {} 
    grp_dict['group'] = grp 
    for cat, cat_data in grp_data.groupby('Category'): 
     grp_dict['category_list'] = [] 
     cat_dict = {} 
     cat_dict['category'] = cat 
     cat_dict['p_list'] = [] 
     for p, p_data in cat_data.groupby('P'): 
      p_data = p_data.drop(['Category', 'Group'], axis=1).set_index('P') 
      for d in p_data.to_dict(orient='records'): 
       cat_dict['p_list'].append({'p': p, 'date_list': [d]}) 
     grp_dict['category_list'].append(cat_dict) 
    json_dict['group_list'].append(grp_dict) 
json_out = dumps(json_dict) 
parsed = json.loads(json_out) 

в результате:

json.dumps(parsed, indent=4, sort_keys=True) 

{ 
    "group_list": [ 
     { 
      "category_list": [ 
       { 
        "category": "A", 
        "p_list": [ 
         { 
          "date_list": [ 
           { 
            "End": "2014/01/02", 
            "Start": "2014/01/01", 
            "Value": -0.0061 
           } 
          ], 
          "p": "A" 
         }, 
         { 
          "date_list": [ 
           { 
            "End": "2015/08/21", 
            "Start": "2015/07/11", 
            "Value": 1.5 
           } 
          ], 
          "p": "A" 
         } 
        ] 
       } 
      ], 
      "group": "A" 
     }, 
     { 
      "category_list": [ 
       { 
        "category": "Q", 
        "p_list": [ 
         { 
          "date_list": [ 
           { 
            "End": "2014/09/30", 
            "Start": "2013/05/19", 
            "Value": -100.0 
           } 
          ], 
          "p": "D" 
         } 
        ] 
       } 
      ], 
      "group": "N" 
     }, 
     { 
      "category_list": [ 
       { 
        "category": "U", 
        "p_list": [ 
         { 
          "date_list": [ 
           { 
            "End": "2016/01/05", 
            "Start": "2016/01/01", 
            "Value": 2.75 
           } 
          ], 
          "p": "C" 
         } 
        ] 
       } 
      ], 
      "group": "R" 
     } 
    ] 
} 
Смежные вопросы