Pandas groupby цепочка: переименовать многоиндексный столбец в один столбец строки - PullRequest
2 голосов
/ 23 апреля 2019

Я выполнял некоторые непрерывные операции над кадром данных панд, где мне нужно связать операцию переименования. Ситуация такая:

import numpy as np
import pandas as pd
import seaborn as sns

df = sns.load_dataset('tips')

g = (df.groupby(['sex','time','smoker'])
     .agg({'tip': ['count','sum'],
           'total_bill': ['count','mean']})
     .reset_index()
    )

print(g.head())

Это дает:

      sex    time smoker   tip         total_bill           
                         count     sum      count       mean
0    Male   Lunch    Yes    13   36.28         13  17.374615
1    Male   Lunch     No    20   58.83         20  18.486500
2    Male  Dinner    Yes    47  146.79         47  23.642553
3    Male  Dinner     No    77  243.17         77  20.130130
4  Female   Lunch    Yes    10   28.91         10  17.431000

без цепочки
Я могу сделать это вручную в другой строке:

g.columns = [i[0] + '_' + i[1] if i[1] else i[0] 
             for i in g.columns.ravel()]

Он работает нормально, но я бы хотел связать этот процесс переименования столбцов, чтобы я мог связать другие операции.

Но я хочу внутри цепочки

Как это сделать?

Требуемый выход :

g = (df.groupby(['sex','time','smoker'])
     .agg({'tip': ['count','sum'],
           'total_bill': ['count','mean']})
     .reset_index()
     .rename(something here)
     # or .set_axis(something here)
     # or, .pipe(something here)  I am not sure.
    ) # If i could do this this, i can do further chaining

     sex    time     smoker tip_count tip_sum  total_bill_count total_bill_mean
0    Male   Lunch    Yes    13   36.28         13  17.374615
1    Male   Lunch     No    20   58.83         20  18.486500
2    Male  Dinner    Yes    47  146.79         47  23.642553
3    Male  Dinner     No    77  243.17         77  20.130130
4  Female   Lunch    Yes    10   28.91         10  17.431000

1 Ответ

3 голосов
/ 23 апреля 2019

Вы можете использовать pipe для обработки этого:

import numpy as np
import pandas as pd
import seaborn as sns

df = sns.load_dataset('tips')

g = (df.groupby(['sex','time','smoker'])
     .agg({'tip': ['count','sum'],
           'total_bill': ['count','mean']})
     .reset_index()
     .pipe(lambda x: x.set_axis([f'{a}_{b}' if b == '' else f'{a}' for a,b in x.columns], axis=1, inplace=False))
    )

print(g.head())

Вывод:

      sex    time smoker  tip_count  tip_sum  total_bill_count  total_bill_mean
0    Male   Lunch    Yes         13    36.28                13        17.374615
1    Male   Lunch     No         20    58.83                20        18.486500
2    Male  Dinner    Yes         47   146.79                47        23.642553
3    Male  Dinner     No         77   243.17                77        20.130130
4  Female   Lunch    Yes         10    28.91                10        17.431000

Примечание. Я использую форматирование f-строки. Требуется Python 3.6+.

...