группа Python Python агрегат с функцией min - PullRequest
1 голос
/ 18 июня 2019

У меня есть такой фрейм данных:

df = pd.DataFrame({'year': [2018, 2018, 2018, 2018, 2018, 2018, 2019, 2019, 2019, 2019, 2019, 2019],
                   'label': ['A', 'B', 'C', 'A', 'B', 'D', 'A', 'E', 'F', 'G', 'E', 'E'],
                   'cat' : [236, 546, 671, 555, 871, 229, 811, 992, 227, 341, 701, 508],
                   'value': [2, 5, 6, 1, 9, 4, 7, 8, 13, 11, 3, 12]})

И я хотел бы сгруппировать его по year и label и вернуть для каждой группы строку с наименьшим значением для value.Строка должна включать (исходное) значение индекса, а также все столбцы (от df).

Итак, результат должен выглядеть следующим образом:

 3  2018  A  555   1
 1  2018  B  546   5
 2  2018  C  671   6
 5  2018  D  229   4
 6  2019  A  811   7
10  2019  E  701   3
 8  2019  F  227  13
 9  2019  G  341  11

Мой код такfar:

df.groupby(by=['year', 'label']).min().reset_index()

Это имеет правильные значения для value, но не для cat.Также отсутствует (оригинальный) индекс.

Есть предложения, как решить эту проблему?

Ответы [ 3 ]

3 голосов
/ 18 июня 2019

Вы можете сделать с idxmin():

df.loc[df.groupby(['year','label']).value.idxmin()]

Выход:

    year label  cat  value
3   2018     A  555      1
1   2018     B  546      5
2   2018     C  671      6
5   2018     D  229      4
6   2019     A  811      7
10  2019     E  701      3
8   2019     F  227     13
9   2019     G  341     11
2 голосов
/ 18 июня 2019

Это хороший признак того, что вы хотите отсортировать, а затем вызвать drop_duplicates, поскольку groupby уничтожает исходный индекс.

# This is a little simpler but the order will change.
# df.sort_values('value').drop_duplicates(['year', 'label'])

df.sort_values(['year', 'label', 'value']).drop_duplicates(['year', 'label'])

    year label  cat  value
3   2018     A  555      1
1   2018     B  546      5
2   2018     C  671      6
5   2018     D  229      4
6   2019     A  811      7
10  2019     E  701      3
8   2019     F  227     13
9   2019     G  341     11
0 голосов
/ 18 июня 2019

1. Сначала нужно найти мин.
res = df.groupby(['Year','label'],as_index=False)['value'].min()

2. Затем объединить с оригинальным df final_result = pd.merge(df[['Year','label','cat']],res,on=['Year','label'],how='inner')

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...