2

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?

jpp
  • 159,742
  • 34
  • 281
  • 339
MMMMS
  • 2,179
  • 9
  • 43
  • 83

2 Answers2

1

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
jpp
  • 159,742
  • 34
  • 281
  • 339
1

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
jezrael
  • 822,522
  • 95
  • 1,334
  • 1,252