Переименование столбцов результатов из агрегации Pandas («FutureWarning: использование dict с переименованием устарело»)

Я пытаюсь сделать некоторые скопления в кадре данных pandas. Вот пример кода:

import pandas as pd df = pd.DataFrame({"User": ["user1", "user2", "user2", "user3", "user2", "user1"], "Amount": [10.0, 5.0, 8.0, 10.5, 7.5, 8.0]}) df.groupby(["User"]).agg({"Amount": {"Sum": "sum", "Count": "count"}}) Out[1]: Amount Sum Count User user1 18.0 2 user2 20.5 3 user3 10.5 1 

Что генерирует следующее предупреждение:

FutureWarning: использование dict с переименованием устарело и будет удалено в будущей версии return super (DataFrameGroupBy, self) .aggregate (arg, * args, ** kwargs)

Как я могу избежать этого?

Использовать groupby apply и возвращать Серию для переименования столбцов

Используйте метод groupby apply для выполнения агрегации, которая

  • Переименовывает столбцы
  • Позволяет пробелы в именах
  • Позволяет вам заказывать возвращенные столбцы любым способом
  • Позволяет взаимодействовать между столбцами
  • Возвращает индекс одного уровня, а не MultiIndex

Сделать это:

  • создать пользовательскую функцию, которую вы передаете для apply
  • Эта настраиваемая функция передается каждой группе в виде DataFrame
  • Возrotation серии
  • Индексом серии будут новые столбцы

Создание поддельных данных

 df = pd.DataFrame({"User": ["user1", "user2", "user2", "user3", "user2", "user1", "user3"], "Amount": [10.0, 5.0, 8.0, 10.5, 7.5, 8.0, 9], 'Score': [9, 1, 8, 7, 7, 6, 9]}) 

введите описание изображения здесь

создать пользовательскую функцию, которая возвращает серию
Переменная x внутри my_agg – это DataFrame

 def my_agg(x): names = { 'Amount mean': x['Amount'].mean(), 'Amount std': x['Amount'].std(), 'Amount range': x['Amount'].max() - x['Amount'].min(), 'Score Max': x['Score'].max(), 'Score Sum': x['Score'].sum(), 'Amount Score Sum': (x['Amount'] * x['Score']).sum()} return pd.Series(names, index=['Amount range', 'Amount std', 'Amount mean', 'Score Sum', 'Score Max', 'Amount Score Sum']) 

Передайте эту настраиваемую функцию методу groupby apply

 df.groupby('User').apply(my_agg) 

введите описание изображения здесь

Большой недостаток заключается в том, что эта функция будет намного медленнее, чем agg для cythonized aggregations

Использование словаря с agg метода groupby agg

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

 df.groupby('User')['Amount'].agg(['sum', 'count']) 

Вывод

  sum count User user1 18.0 2 user2 20.5 3 user3 10.5 1 

По-прежнему можно использовать словарь для явного обозначения разных агрегатов для разных столбцов, например, здесь, если был другой числовой столбец с именем « Other .

 df = pd.DataFrame({"User": ["user1", "user2", "user2", "user3", "user2", "user1"], "Amount": [10.0, 5.0, 8.0, 10.5, 7.5, 8.0], 'Other': [1,2,3,4,5,6]}) df.groupby('User').agg({'Amount' : ['sum', 'count'], 'Other':['max', 'std']}) 

Вывод

  Amount Other sum count max std User user1 18.0 2 6 3.535534 user2 20.5 3 5 1.527525 user3 10.5 1 4 NaN 

Если вы замените внутренний словарь на список кортежей, он избавится от предупреждения

 import pandas as pd df = pd.DataFrame({"User": ["user1", "user2", "user2", "user3", "user2", "user1"], "Amount": [10.0, 5.0, 8.0, 10.5, 7.5, 8.0]}) df.groupby(["User"]).agg({"Amount": [("Sum", "sum"), ("Count", "count")]}) 
  • Пакетное переименование файлов в Linux
  • Давайте будем гением компьютера.