ti-enxame.com

maneira concisa de achatar colunas multi-índice

O uso de mais de uma função em um grupo por agregado resulta em um índice múltiplo que eu quero achatar.

exemplo:

df = pd.DataFrame(
    {'A': [1,1,1,2,2,2,3,3,3],
     'B': np.random.random(9),
     'C': np.random.random(9)}
)
out = df.groupby('A').agg({'B': [np.mean, np.std], 'C': np.median})

# example output

          B                   C
       mean       std    median
A
1  0.791846  0.091657  0.394167
2  0.156290  0.202142  0.453871
3  0.482282  0.382391  0.892514

Atualmente, eu faço manualmente assim

out.columns = ['B_mean', 'B_std', 'C_median']

o que me dá o resultado que eu quero

     B_mean     B_std  C_median
A
1  0.791846  0.091657  0.394167
2  0.156290  0.202142  0.453871
3  0.482282  0.382391  0.892514

mas estou procurando uma maneira de automatizar esse processo, pois isso é monótono, demorado e me permite digitar erros ao renomear as colunas.

Existe uma maneira de retornar um índice nivelado em vez de um índice múltiplo ao fazer um agregado por grupo?

Preciso achatar as colunas para salvar em um arquivo de texto, que será lido por um programa diferente que não lida com colunas com vários índices.

8
Haleemur Ali

Você pode fazer um mapjoin com colunas

out.columns = out.columns.map('_'.join)
out
Out[23]: 
     B_mean     B_std  C_median
A                              
1  0.204825  0.169408  0.926347
2  0.362184  0.404272  0.224119
3  0.533502  0.380614  0.218105

Por alguma razão (quando a coluna contém int), gosto mais dessa maneira

out.columns.map('{0[0]}_{0[1]}'.format) 
Out[27]: Index(['B_mean', 'B_std', 'C_median'], dtype='object')
22
YOBEN_S

Você pode usar:

out.columns = list(map('_'.join, out.columns.values))
3
llllllllll

Desde a versão 0.24.0, você pode usar apenas to_flat_index.

out.columns = [f"{x}_{y}" for x, y in out.columns.to_flat_index()]

    B_mean      B_std       C_median
A           
1   0.779592    0.137168    0.583211
2   0.158010    0.229234    0.550383
3   0.186771    0.150575    0.313409
1
Julio