2016-05-23 4 views
3

У меня есть следующие данные, по которым мне нужно выполнить функцию агрегации, за которой следует groupby.Как конвертировать серии pandas в желаемый формат JSON?

Мои данные следующим образом: data.csv

id,category,sub_category,count 
0,x,sub1,10 
1,x,sub2,20 
2,x,sub2,10 
3,y,sub3,30 
4,y,sub3,5 
5,y,sub4,15 
6,z,sub5,20 

Здесь я пытаюсь получить счетчик на подкатегорию мудр. После этого мне нужно сохранить результат в формате JSON. Следующий код помогает мне в достижении этого. test.py

import pandas as pd 
df = pd.read_csv('data.csv') 
sub_category_total = df['count'].groupby([df['category'], df['sub_category']]).sum() 
print sub_category_total.reset_index().to_json(orient = "records") 

Приведенный выше код дает мне следующий формат.

[{"category":"x","sub_category":"sub1","count":10},{"category":"x","sub_category":"sub2","count":30},{"category":"y","sub_category":"sub3","count":35},{"category":"y","sub_category":"sub4","count":15},{"category":"z","sub_category":"sub5","count":20}] 

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

{ 
"x":[{ 
    "sub_category":"sub1", 
    "count":10 
    }, 
    { 
    "sub_category":"sub2", 
     "count":30}], 
"y":[{ 
    "sub_category":"sub3", 
    "count":35 
    }, 
    { 
    "sub_category":"sub4", 
    "count":15}], 
"z":[{ 
    "sub_category":"sub5", 
     "count":20}] 
} 

По результатам обсуждений @How to convert pandas DataFrame result to user defined json format, я заменил последние 2 строки test.py с,

g = df.groupby('category')[["sub_category","count"]].apply(lambda x: x.to_dict(orient='records')) 
print g.to_json() 

Это дает мне следующий выход.

{"x":[{"count":10,"sub_category":"sub1"},{"count":20,"sub_category":"sub2"},{"count":10,"sub_category":"sub2"}],"y":[{"count":30,"sub_category":"sub3"},{"count":5,"sub_category":"sub3"},{"count":15,"sub_category":"sub4"}],"z":[{"count":20,"sub_category":"sub5"}]} 

Хотя этот результат несколько похож на мой нужный формат, я не мог выполнять любую функцию агрегации здесь, как он бросает ошибку говоря . Следовательно, я получаю все строки в файле данных.

Может ли кто-нибудь помочь мне в достижении вышеуказанного формата JSON?

ответ

5

Я думаю, вы можете первый агрегат с sum, параметр as_index=False был добавлен в groupby, поэтому выход Dataframedf1, а затем использовать other solution:

df1 = (df.groupby(['category','sub_category'], as_index=False)['count'].sum()) 
print (df1) 
    category sub_category count 
0  x   sub1  10 
1  x   sub2  30 
2  y   sub3  35 
3  y   sub4  15 
4  z   sub5  20 

g = df1.groupby('category')[["sub_category","count"]] 
     .apply(lambda x: x.to_dict(orient='records')) 

print (g.to_json()) 
{ 
    "x": [{ 
     "sub_category": "sub1", 
     "count": 10 
    }, { 
     "sub_category": "sub2", 
     "count": 30 
    }], 
    "y": [{ 
     "sub_category": "sub3", 
     "count": 35 
    }, { 
     "sub_category": "sub4", 
     "count": 15 
    }], 
    "z": [{ 
     "sub_category": "sub5", 
     "count": 20 
    }] 
} 
+0

Я попытался вверх голосовать дважды ... Это не позволит мне. – piRSquared

+0

Спасибо. Btw, очень приятно [вопрос] (http://meta.stackoverflow.com/questions/323414/incentivizing-people-to-avoid-gamesmanship). ;) – jezrael

+0

Вау! Фантастика! большое спасибо @jezrael :) –

Смежные вопросы