扁平化多指数柱的简洁方法

Hal*_*Ali 7 pandas pandas-groupby

在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
Run Code Online (Sandbox Code Playgroud)

目前,我是这样手动完成的

out.columns = ['B_mean', 'B_std', 'C_median']
Run Code Online (Sandbox Code Playgroud)

这给了我想要的结果

     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
Run Code Online (Sandbox Code Playgroud)

但是我正在寻找一种自动化这个过程的方法,因为这是单调的,耗时的,并且允许我在重命名列时进行拼写错误.

在进行groupby-aggregate时,有没有办法返回扁平索引而不是多索引?

我需要将列展平以保存到文本文件,然后由不处理多索引列的其他程序读取该文件.

WeN*_*Ben 18

你可以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
Run Code Online (Sandbox Code Playgroud)

出于某种原因(当列包含int时)我更喜欢这种方式

out.columns.map('{0[0]}_{0[1]}'.format) 
Out[27]: Index(['B_mean', 'B_std', 'C_median'], dtype='object')
Run Code Online (Sandbox Code Playgroud)


Jul*_*lio 11

从版本 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
Run Code Online (Sandbox Code Playgroud)


lll*_*lll 5

您可以使用:

out.columns = list(map('_'.join, out.columns.values))
Run Code Online (Sandbox Code Playgroud)


Tho*_*mas 5

基于其他答案:如果其中一列在第二级中未命名,则列名称后面会带有反斜杠(例如D_)。

为了防止这种情况,请使用 lambda 函数:

out.columns = out.columns.map(lambda x: '_'.join(a for a in x if len(a)>0))
Run Code Online (Sandbox Code Playgroud)