更新的解决方案,我认为您需要:
my_frame[my_frame.groupby(['id','quality'])['grade']\
.transform(lambda x: (x == x.min()) | (x == x.max()))]\
.sort_values(['id','quality'])
输出:
id quality grade characteristic 1 characteristic 2
0 0 A 10 12 14
1 0 A 10 13 15
2 0 A 8 12 13
4 0 A 8 11 15
6 0 B 11 5 9
7 0 B 8 7 8
9 0 B 8 10 14
8 1 A 11 14 9
11 1 A 10 5 9
10 1 B 11 6 6
12 1 B 9 6 6
并且,转换为二维数组:
my_frame[my_frame.groupby(['id','quality'])['grade']\
.transform(lambda x: (x == x.min()) | (x == x.max()))]\
.sort_values(['id','quality']).values.tolist()
输出:
[[0, 'A', 10, 12, 14],
[0, 'A', 10, 13, 15],
[0, 'A', 8, 12, 13],
[0, 'A', 8, 11, 15],
[0, 'B', 11, 5, 9],
[0, 'B', 8, 7, 8],
[0, 'B', 8, 10, 14],
[1, 'A', 11, 14, 9],
[1, 'A', 10, 5, 9],
[1, 'B', 11, 6, 6],
[1, 'B', 9, 6, 6]]
IIUC,您希望将groupby聚合的结果加入到原始数据帧:
my_frame.merge(my_frame.groupby(['id','quality'])['grade']
.agg(['max','min', lambda x: x.max()-x.min()]),
left_on=['id','quality'],
right_index=True).values.tolist()
输出:
[[0, 'A', 10, 12, 14, 10, 8, 2],
[0, 'A', 10, 13, 15, 10, 8, 2],
[0, 'A', 8, 12, 13, 10, 8, 2],
[0, 'A', 9, 13, 17, 10, 8, 2],
[0, 'A', 8, 11, 15, 10, 8, 2],
[0, 'B', 9, 5, 7, 11, 8, 3],
[0, 'B', 11, 5, 9, 11, 8, 3],
[0, 'B', 8, 7, 8, 11, 8, 3],
[0, 'B', 8, 10, 14, 11, 8, 3],
[1, 'A', 11, 14, 9, 11, 11, 0],
[1, 'B', 11, 6, 6, 11, 11, 0]]