web-dev-qa-db-fra.com

façon concise d'aplatir les colonnes multi-index

L'utilisation de plus d'une fonction dans un groupe par agrégats entraîne un multi-index que je souhaite ensuite aplatir.

exemple:

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

Actuellement, je le fais manuellement comme ça

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

ce qui me donne le résultat que je veux

     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

mais je cherche un moyen d'automatiser ce processus, car cela est monotone, prend du temps et me permet de faire des fautes de frappe lorsque je renomme les colonnes.

Existe-t-il un moyen de renvoyer un index aplati au lieu d'un multi-index lorsque vous effectuez un regroupement groupé?

J'ai besoin d'aplatir les colonnes pour les enregistrer dans un fichier texte, qui sera ensuite lu par un programme différent qui ne gère pas les colonnes multi-indexées.

8
Haleemur Ali

Vous pouvez faire un mapjoin avec des colonnes

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

Pour une raison quelconque (lorsque la colonne contient int) j'aime mieux cette façon

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

Vous pouvez utiliser:

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

Depuis la version 0.24.0, vous pouvez simplement utiliser 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