У меня есть набор данных, который я группирую по учетной записи, имени и дате. И создание функции для сохранения только минимального значения «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()
Это возвращает мне определенные строки, которые я хочу. Но тогда я не знаю, как вернуть остальную часть фрейма данных.
Вы можете сделать это, вообще не используя 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
будет включен в вывод, а значение будет минимальным значением alt_fee
для каждой комбинации ['account', 'name', 'date']
Я также хочу весь фрейм данных, все столбцы в фрейме данных. только те столбцы, которые соответствуют этим параметрам
У вас больше столбцов, чем 3, используемых в groupby
и alt_fee
?
Да. Всего 8 столбцов.
Если обновленное решение решает эту проблему, можете ли вы принять ответ?
Давайте продолжить обсуждение в чате.
Только что понял. Вот код на случай, если кто-то еще застрянет здесь.
def drop(df):
return df[df['alt_fee'] == df['alt_fee'].min()].drop_duplicates(subset=(['account', 'name','date']),keep='first')
Как сейчас написано, ваш ответ неясен. Пожалуйста, редактировать, чтобы добавить дополнительную информацию, которая поможет другим понять, как это относится к заданному вопросу. Дополнительную информацию о том, как писать хорошие ответы, можно найти в справочном центре.
Как бы я использовал эту технику, чтобы найти минимум столбца «alt_fee».