web-dev-qa-db-ja.com

マルチインデックス列をフラット化する簡潔な方法

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を実行するときに、マルチインデックスではなくフラット化されたインデックスを返す方法はありますか?

列をフラット化してテキストファイルに保存する必要があります。テキストファイルは、マルチインデックス列を処理しない別のプログラムによって読み取られます。

8
Haleemur Ali

列でmapjoinを実行できます

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')
22
YOBEN_S

以下を使用できます。

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

バージョン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
1
Julio