Python-код для группировки и возврата всех обнаруженных в данных случаев - PullRequest
0 голосов
/ 06 декабря 2018

Предположим, что мои данные:

my_list=[[0,'A',10,12,14],
         [0,'A',10,13,15],
         [0,'A',8,12,13],
         [0,'A',9,13,17],
         [0,'A',8,11,15],
         [0,'B',9,5,7],
         [0,'B',11,5,9],
         [0,'B',8,7,8],
         [1,'A',11,14,9],
         [0,'B',8,10,14],
         [1,'B',11,6,6],
         [1,'A',10,5,9]
         [1,'B',9,6,6]]

my_frame=pd.DataFrame(my_list, columns=['id','quality','grade','characteristic 1','characteristic 2'])

Моя цель - сгруппировать мои данные по 'id' и 'качеству', используя оценку в качестве максимального и минимального значения интереса.Поэтому я кодирую:

my_group=np.array(my_frame.groupby(['id','quality'])['grade']
         .agg(["max grade", max],["min grade", min])
         .reset_index())

Пока все хорошо, но я не понял, как обращаться с тем, что мне действительно нужно в качестве информации:

Я хотел бы сгруппировать и получить все случаиэта оценка максимальная и минимальная происходит со всей информацией строки.Другими словами, код, который в настоящее время работает для меня, дает мне следующее:

print(my_group)

Вывод:

[[0,'A',10,8],
 [0,'B',11,8],
 [1,'A',11,10],
 [1,'B',11,9]]

Тем не менее, меня интересует вывод такого вида:

[[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]]

Чтобы сделать это как можно более понятным, группа принесет мне максимальную и минимальную оценку за «id» и за «качество», но мне действительно нужно знать остальную частьинформация («характеристика 1» и «характеристика 2») о том, что я получаю этот максимальный и минимальный «баллы», независимо от того, сколько раз появляются максимальные «минимальные» и минимальные «оценки».

Не могли бы вы мне помочьсквозь это?Надеюсь, мой вопрос ясен.

1 Ответ

0 голосов
/ 06 декабря 2018

Обновленное решение, я думаю, вам нужно это:

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

И, преобразованный в 2d массив:

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, вы хотите объединить результаты агрегирования по группам с исходным фреймом данных:

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]]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...