代码之家  ›  专栏  ›  技术社区  ›  Haleemur Ali

展平多索引列的简洁方法

  •  1
  • Haleemur Ali  · 技术社区  · 6 年前

    在GroupBy聚合中使用一个以上的函数会产生一个多索引,然后我希望它变平。

    例子:

    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聚合时,是否有方法返回扁平索引而不是多索引?

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

    2 回复  |  直到 6 年前
        1
  •  10
  •   BENY    6 年前

    你可以做一个 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')
    
        2
  •  1
  •   llllllllll    6 年前

    您可以使用:

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