Функция grouopby.apply не дает правильного результата

У меня есть набор данных, который я группирую по учетной записи, имени и дате. И создание функции для сохранения только минимального значения «alt_fee» каждой уникальной комбинации.

def drop(df):
   return df[df['alt_fee']==df['alt_fee'].min()]
result = df.groupby(['account', 'name', 'date']).apply(drop)

Это дает мне больше строк, чем нужно. Я вижу более одной записи для каждой уникальной комбинации учетной записи, имени и даты. Я не уверен, почему. В кадре данных, который он создает, столбцы, которые находятся в индексе, учетной записи, имени и дате. есть несколько одинаковых. Но я вижу, что числовой индекс отличается. Может быть, есть способ удалить индекс перед группировкой.

Я замечаю, что когда я помещаю этот код в функцию:

def drop(df):
    return df['alt_fee'].min()

Это возвращает мне определенные строки, которые я хочу. Но тогда я не знаю, как вернуть остальную часть фрейма данных.

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
0
27
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Вы можете сделать это, вообще не используя apply(). При использовании функции groupby будет возвращена только одна запись для каждой комбинации. При использовании min() в качестве агрегатора будет возвращено минимальное значение для всех других числовых полей в ваших данных.

result = df.groupby(['account', 'name', 'date']).min()

Обращение к комментарию

Вы можете взять только столбец alt_fee из приведенного выше кода, а затем объединить его с исходным набором данных.

result = df.groupby(['account', 'name', 'date']).min()[['alt_fee']].reset_index()
result = result.merge(df, on=['account', 'name', 'date', 'alt_fee'])

Примечание:, если есть несколько строк с одинаковыми alt_fee, вам нужно будет удалить дубликаты впоследствии

result = result.drop_duplicates(['account', 'name', 'date', 'alt_fee'], keep='first')` to remove those values.

Как бы я использовал эту технику, чтобы найти минимум столбца «alt_fee».

learnin333 04.05.2022 21:34

Столбец alt_fee будет включен в вывод, а значение будет минимальным значением alt_fee для каждой комбинации ['account', 'name', 'date']

Desi Pilla 04.05.2022 21:37

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

learnin333 04.05.2022 21:40

У вас больше столбцов, чем 3, используемых в groupby и alt_fee?

Desi Pilla 04.05.2022 21:42

Да. Всего 8 столбцов.

learnin333 04.05.2022 21:43

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

Desi Pilla 04.05.2022 22:29

Давайте продолжить обсуждение в чате.

learnin333 05.05.2022 02:43

Только что понял. Вот код на случай, если кто-то еще застрянет здесь.

def drop(df):
    return df[df['alt_fee'] == df['alt_fee'].min()].drop_duplicates(subset=(['account', 'name','date']),keep='first')

Как сейчас написано, ваш ответ неясен. Пожалуйста, редактировать, чтобы добавить дополнительную информацию, которая поможет другим понять, как это относится к заданному вопросу. Дополнительную информацию о том, как писать хорошие ответы, можно найти в справочном центре.

Community 05.05.2022 08:55

Другие вопросы по теме