您可以先在AVG_MINUTES 和AVG_GRADE 列中创建lists。然后groupby 和aggregate tolist() 最后使用DataFrame.to_dict 和参数orient='records':
df.AVG_MINUTES = df[['HOUR','AVG_MINUTES']].values.tolist()
df.AVG_GRADE = df[['HOUR','AVG_GRADE']].values.tolist()
print (df)
GROUP HOUR AVG_MINUTES AVG_GRADE
0 AAA 7 [7, 67] [7.0, 5.5]
1 AAA 8 [8, 58] [8.0, 6.5]
2 AAA 9 [9, 55] [9.0, 4.5]
3 BBB 7 [7, 15] [7.0, 5.1]
4 BBB 8 [8, 18] [8.0, 5.4]
5 CCC 9 [9, 34] [9.0, 5.5]
df = df.groupby('GROUP')['AVG_MINUTES','AVG_GRADE']
.agg(lambda x : x.tolist())
.reset_index()
.to_dict(orient='records')
print (df)
[
{'GROUP': 'AAA',
'AVG_GRADE': [[7.0, 5.5], [8.0, 6.5], [9.0, 4.5]],
'AVG_MINUTES': [[7, 67], [8, 58], [9, 55]]},
{'GROUP': 'BBB',
'AVG_GRADE': [[7.0, 5.1], [8.0, 5.4]],
'AVG_MINUTES': [[7, 15], [8, 18]]},
{'GROUP': 'CCC',
'AVG_GRADE': [[9.0, 5.5]],
'AVG_MINUTES': [[9, 34]]}
]
如果使用DataFrame.to_json 输出类似 - 输出中的HOUR 是由zip 创建的int,其中输出是list of tuples 由map 转换为list of lists 的内容:
df.AVG_MINUTES = list(map(list, zip(df.HOUR, df.AVG_MINUTES)))
df.AVG_GRADE = list(map(list, zip(df.HOUR, df.AVG_GRADE)))
print (df)
GROUP HOUR AVG_MINUTES AVG_GRADE
0 AAA 7 [7, 67] [7, 5.5]
1 AAA 8 [8, 58] [8, 6.5]
2 AAA 9 [9, 55] [9, 4.5]
3 BBB 7 [7, 15] [7, 5.1]
4 BBB 8 [8, 18] [8, 5.4]
5 CCC 9 [9, 34] [9, 5.5]
df = df.groupby('GROUP')['AVG_MINUTES','AVG_GRADE']
.agg(lambda x : x.tolist())
.reset_index()
.to_json(orient='records')
print (df)
[{"GROUP":"AAA",
"AVG_MINUTES":[[7,67],[8,58],[9,55]],
"AVG_GRADE":[[7,5.5],[8,6.5],[9,4.5]]},
{"GROUP":"BBB",
"AVG_MINUTES":[[7,15],[8,18]],
"AVG_GRADE":[[7,5.1],[8,5.4]]},
{"GROUP":"CCC",
"AVG_MINUTES":[[9,34]],
"AVG_GRADE":[[9,5.5]]}]