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.
Vous pouvez faire un map
join
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')
Vous pouvez utiliser:
out.columns = list(map('_'.join, out.columns.values))
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