Как найти все строки в кадре данных pandas, которые имеют максимальное значение для count
столбца, после группировки по ['Sp','Mt']
столбцам?
Пример 1: следующий dataFrame, который я группирую по ['Sp','Mt']
:
Sp Mt Value count
0 MM1 S1 a **3**
1 MM1 S1 n 2
2 MM1 S3 cb 5
3 MM2 S3 mk **8**
4 MM2 S4 bg **10**
5 MM2 S4 dgd 1
6 MM4 S2 rd 2
7 MM4 S2 cb 2
8 MM4 S2 uyi **7**
Ожидаемый результат: получите строки результатов, чье количество макс. Между группами, например:
0 MM1 S1 a **3**
1 3 MM2 S3 mk **8**
4 MM2 S4 bg **10**
8 MM4 S2 uyi **7**
Пример 2: этот фрейм данных, который я группирую по ['Sp','Mt']
:
Sp Mt Value count
4 MM2 S4 bg 10
5 MM2 S4 dgd 1
6 MM4 S2 rd 2
7 MM4 S2 cb 8
8 MM4 S2 uyi 8
Для приведенного выше примера я хочу получить все строки, где count
равно max, в каждой группе, например:
MM2 S4 bg 10
MM4 S2 cb 8
MM4 S2 uyi 8
python
pandas
max
pandas-groupby
jojo12
источник
источник
1 3
?Ответы:
Чтобы получить индексы оригинального DF вы можете сделать:
Обратите внимание, что если у вас есть несколько максимальных значений на группу, все будут возвращены.
Обновить
С большой вероятностью, что ОП запрашивает следующее:
источник
idx
подход. Но я могу позволить себе только один максимум для каждой группы (и мои данные имеют несколько дубликатов-максимумов). Есть ли способ обойти это с вашим решением?transform
Метод может иметь производительность пула, когда набор данных достаточно большой, сначала получите максимальное значение, а затем объедините кадры данных.Вы можете отсортировать dataFrame по количеству, а затем удалить дубликаты. Я думаю, что это проще:
источник
inplace = True
в качестве аргумента дляdrop_duplicates
Простым решением было бы применить: функцию idxmax (), чтобы получить индексы строк с максимальными значениями. Это отфильтровывает все строки с максимальным значением в группе.
источник
"I want to get ALL the rows where count equals max in each group"
, в то время как вidxmax
Return[s] index of first occurrence of maximum over requested axis"
соответствии с документами (0,21).Попробовав решение, предложенное Zelazny, на относительно большом DataFrame (~ 400 тыс. Строк) я обнаружил, что оно очень медленное. Вот альтернатива, которую я нашел для ускорения выполнения моих данных на несколько порядков.
источник
df[df['count'] == df['count_max']]
будут потеряны строки NaN, а также ответы выше.Возможно, вам не нужно делать с группой, используя
sort_values
+drop_duplicates
Также почти та же логика с помощью
tail
источник
Для меня самым простым решением было бы сохранить значение, когда число равно максимуму. Следовательно, достаточно следующей однострочной команды:
источник
Использование
groupby
иidxmax
методы:передать col
date
кdatetime
:получить индекс
max
столбцаdate
, послеgroupyby ad_id
:получить нужные данные:
Из [54]:
источник
источник
Понимая, что «применение» «самого большого» к объекту группировки работает так же хорошо:
Дополнительное преимущество - также может получить верхние значения n, если требуется:
источник
Попробуйте использовать «nlargest» для объекта groupby. Преимущество использования nlargest состоит в том, что он возвращает индекс строк, из которых были получены «самые большие элементы». Примечание: мы разрезаем второй (1) элемент нашего индекса, так как наш индекс в этом случае состоит из кортежей (например, (s1, 0)).
введите описание изображения здесь
источник
Я использовал этот функциональный стиль для многих групповых операций:
.reset_index(drop=True)
возвращает вас к исходному индексу, удаляя групповой индекс.источник