Groupby-aggregateで複数の関数を使用すると、フラット化したいマルチインデックスが生成されます。
例:
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
現在、私はこれを手動で行います
out.columns = ['B_mean', 'B_std', 'C_median']
欲しい結果が出ます
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
しかし、このプロセスを自動化する方法を探しています。これは単調で時間のかかる作業であり、列の名前を変更するときにタイプミスをすることができるためです。
Groupby-aggregateを実行するときに、マルチインデックスではなくフラット化されたインデックスを返す方法はありますか?
列をフラット化してテキストファイルに保存する必要があります。テキストファイルは、マルチインデックス列を処理しない別のプログラムによって読み取られます。
列でmap
join
を実行できます
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
なんらかの理由で(列にintが含まれている場合)この方法のほうが好きです
out.columns.map('{0[0]}_{0[1]}'.format)
Out[27]: Index(['B_mean', 'B_std', 'C_median'], dtype='object')
以下を使用できます。
out.columns = list(map('_'.join, out.columns.values))
バージョン0.24.0以降、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