Reputation: 2201
I have a data like below, I am trying to group the data into dayname and hour.
[
{
"avg": 52,
"hour": 9,
"dayname": "Friday"
},
{
"avg": 1,
"hour": 10,
"dayname": "Friday"
},
{
"avg": 12,
"hour": 11,
"dayname": "Friday"
},
{
"avg": 3,
"hour": 12,
"dayname": "Friday"
},
{
"avg": 12,
"hour": 09,
"dayname": "Saturday"
},
{
"avg": 30,
"hour": 10,
"dayname": "Saturday"
},
{
"avg": 66,
"hour": 11,
"dayname": "Saturday"
},
{
"avg": 45,
"hour": 12,
"dayname": "Saturday"
}
]
I want the final OP:
hour Friday Saturday
9 52 12
10 1 30
11 12 16
12 3 45
Here is my code tried :
cur = mysql.connection.cursor()
sql = "select avg(value) avg, hour, dayname from table;"
cur.execute(sql)
row_headers = [x[0] for x in cur.description] #this will extract row headers
rv = cur.fetchall()
json_result = []
for result in rv:
json_result.append(dict(zip(row_headers, result)))
# resultfromdb= json.dumps(json_result)
finalresult = #how to get the expected op
return finalresult
From there how can to group and get final result using pandas?
Upvotes: 2
Views: 977
Reputation: 862481
You can use DataFrame
contructor with groupby
, aggregate sum
and reshape by unstack
:
df = (pd.DataFrame(lst)
.groupby(['hour','dayname'])['avg']
.sum()
.unstack(fill_value=0)
.rename_axis(None, 1)
.reset_index())
print (df)
hour Friday Saturday
0 9 52 12
1 10 1 30
2 11 12 66
3 12 3 45
Upvotes: 1
Reputation: 164623
You can feed a list of dictionaries directly into pandas
and then manipulate:
df = pd.DataFrame(lst)
res = df.pivot_table(index='hour', columns='dayname', values='avg', aggfunc=np.sum)\
.reset_index()
res.columns.name = ''
print(res)
hour Friday Saturday
0 9 52 12
1 10 1 30
2 11 12 66
3 12 3 45
Upvotes: 1