Агрегация в pandas фрейме данных с именами столбцов в одной строке - PullRequest
0 голосов
/ 28 мая 2020

Я использую Python 3.6 и выполняю агрегирование, которое я сделал правильно, но имена столбцов не в той форме, которую я хочу.

df = pd.DataFrame({'ID':[1,1,2,2,2],
                   'revenue':[1,3,5,1,5],
                   'month':['2012-01-01','2012-01-01','2012-03-01','2014-01-01','2012-01-01']})
print(df)
   ID       month  revenue
0   1  2012-01-01        1
1   1  2012-01-01        3
2   2  2012-03-01        5
3   2  2014-01-01        1
4   2  2012-01-01        5

Выполняю агрегирование ниже. *

df = df.groupby(['ID']).agg({'revenue':'sum','month':[('distinct_m','nunique'),('month_m','first')]}).reset_index()
print(df)
  ID revenue      month            
         sum distinct_m     month_m
0  1       4          1  2012-01-01
1  2      11          3  2012-03-01

Желаемый результат:

  ID revenue   distinct_m       month
0  1       4            1  2012-01-01
1  2      11            3  2012-03-01

Проблема в том, что я использую смешанную форму выражений внутри agg(). Если бы это было только agg('revenue':'sum'), у меня был бы столбец с именем revenue в том же формате, который я хотел, как показано ниже:

  ID revenue 
0  1       4 
1  2      11 

Но, поскольку я также создаю 2 дополнительных столбца , используя tuple форму ('distinct_m','nunique'),('month_m','first'), я получаю имена столбцов, распределенные по двум строкам.

Есть ли способ получить желаемый результат, показанный выше, в одном агрегате agg()? Я хочу избежать использования формы кортежа для 'revenue':'sum'. Я не ищу впоследствии нескольких операций, чтобы правильно задать имена столбцов. Я использую Python 3.6.

1 Ответ

2 голосов
/ 28 мая 2020

Во избежание этой проблемы используется именованные агрегаты работающие в pandas 0,25 + , где возможно указать имена каждого столбца:

df = (df.groupby(['ID']).agg(revenue=('revenue','sum'),
                             distinct_m=('month','nunique'),
                             month_m = ('month','first')
                            ).reset_index())
print(df)
   ID  revenue  distinct_m     month_m
0   1        4           1  2012-01-01
1   2       11           3  2012-03-01

Для нижних pandas версии возможны сглаживание столбцов в MultiIndex, а затем rename:

df = df.groupby(['ID']).agg({'revenue':'sum',
                             'month':[('distinct_m','nunique'),('month_m','first')]})
df.columns = df.columns.map('_'.join)
df = df.rename(columns={'revenue_sum':'revenue',
                        'month_distinct_m':'distinct_m',
                        'month_month_m':'month_m'})
df = df.reset_index()
print(df)
   ID  revenue  distinct_m     month_m
0   1        4           1  2012-01-01
1   2       11           3  2012-03-01
...