【问题标题】:Merge two column header and give a new name in MultiIndex Dataframe python/Add column above column names合并两个列标题并在 MultiIndex Dataframe python/在列名上方添加列中给出一个新名称
【发布时间】:2020-12-20 04:14:26
【问题描述】:

我有初始数据框:

              r_id1   r_score1    rid2     r_score2
Rank
ID1    ID2
1      A-1    id-1      1.23      id-34      6.78
2      A-1    id-9      2.34      id-45      3.45
3      A-2    id-8      3.56      id-32      4.56
4      A-3    id-6      4.35      id-10      3.98
5      A-4    id-4      7.89      id-67      2.98

我希望我的数据框是 (Result_df):

                 Score_R1              Score_R2
             r_id1   r_score1     rid2     r_score2
ID1    ID2
1      A-1    id-1      1.23      id-34      6.78
2      A-1    id-9      2.34      id-45      3.45
3      A-2    id-8      3.56      id-32      4.56
4      A-3    id-6      4.35      id-10      3.98
5      A-4    id-4      7.89      id-67      2.98

我的数据框是多索引和多索引列。 我试过这段代码

final_df.columns = [' '.join(col).strip() for col in final_df.columns.values]

这给了我这个输出

ID1    ID2    r_id1   r_score1    rid2     r_score2
1      A-1    id-1      1.23      id-34      6.78
2      A-1    id-9      2.34      id-45      3.45
3      A-2    id-8      3.56      id-32      4.56
4      A-3    id-6      4.35      id-10      3.98
5      A-4    id-4      7.89      id-67      2.98

之后:

cols = final_df.columns.map(''.join)

lvl = 'Score_R' + cols.str.extract('(\d+)', expand=False)

final_df.columns = [lvl, cols]

final_df.to_csv("f.csv")

输出是:

             Score_R1  Score_R1    Score_R2  Score_R2
               r_id1   r_score1     rid2     r_score2
ID1    ID2
1      A-1    id-1      1.23      id-34      6.78
2      A-1    id-9      2.34      id-45      3.45
3      A-2    id-8      3.56      id-32      4.56
4      A-3    id-6      4.35      id-10      3.98
5      A-4    id-4      7.89      id-67      2.98

我需要合并同名的列标题

                Score_R1               Score_R2  
              r_id1   r_score1     rid2     r_score2
ID1    ID2
1      A-1    id-1      1.23      id-34      6.78
2      A-1    id-9      2.34      id-45      3.45

【问题讨论】:

    标签: python python-3.x pandas dataframe multi-index


    【解决方案1】:

    您可以使用str.extract 从列名中获取数字,添加前缀并最后分配回MultiIndex in columns 的原始列:

    print (df.columns.tolist())
    [('r_id1', ''), ('r_score1', ''), ('rid2', ''), ('r_score2', '')]
    
    cols = df.columns.map(''.join)
    print (cols.tolist())
    ['r_id1', 'r_score1', 'rid2', 'r_score2']
    
    lvl = 'Score_R' + cols.str.extract('(\d+)', expand=False)
    print (lvl)
    Index(['Score_R1', 'Score_R1', 'Score_R2', 'Score_R2'], dtype='object')
    
    
    df.columns = [lvl, cols]
    print (df)
            Score_R1          Score_R2         
               r_id1 r_score1     rid2 r_score2
    ID1 ID2                                    
    1   A-1     id-1     1.23    id-34     6.78
    2   A-1     id-9     2.34    id-45     3.45
    3   A-2     id-8     3.56    id-32     4.56
    4   A-3     id-6     4.35    id-10     3.98
    5   A-4     id-4     7.89    id-67     2.98
    
    
    df.columns = df.columns.map('_'.join)
    print (df)
            Score_R1_r_id1  Score_R1_r_score1 Score_R2_rid2  Score_R2_r_score2
    ID1 ID2                                                                   
    1   A-1           id-1               1.23         id-34               6.78
    2   A-1           id-9               2.34         id-45               3.45
    3   A-2           id-8               3.56         id-32               4.56
    4   A-3           id-6               4.35         id-10               3.98
    5   A-4           id-4               7.89         id-67               2.98
    

    编辑:您可以将第一级的缺失值替换为空字符串:

    cols = df.columns.droplevel(-1)
    lvl = 'Score_R' + cols.str.extract('(\d+)', expand=False)
    print (lvl)
    Index(['Score_R1', 'Score_R1', 'Score_R2', 'Score_R2'], dtype='object')
    
    lvl = lvl.where(~lvl.duplicated(), '')
    print (lvl)
    Index(['Score_R1', '', 'Score_R2', ''], dtype='object')
    
    df.columns = [lvl, cols]
    print (df)
            Score_R1          Score_R2         
               r_id1 r_score1     rid2 r_score2
    ID1 ID2                                    
    1   A-1     id-1     1.23    id-34     6.78
    2   A-1     id-9     2.34    id-45     3.45
    3   A-2     id-8     3.56    id-32     4.56
    4   A-3     id-6     4.35    id-10     3.98
    5   A-4     id-4     7.89    id-67     2.98
    
    print (df.columns)
    MultiIndex([('Score_R1',    'r_id1'),
                (        '', 'r_score1'),
                ('Score_R2',     'rid2'),
                (        '', 'r_score2')],
               )
    

    【讨论】:

    • final_df.columns = [' '.join(col).strip() for col in final_df.columns.values]之后还是之前?
    • 产生错误"Can only use .str accessor with Index, not MultiIndex" AttributeError: Can only use .str accessor with Index, not MultiIndex
    • [('r_id1', ''), ('r_score1', ''), ('r_id2', ''), ('r_score2', '')]
    • Score_R1 是两列 r-id1 and r_score1 的列标题。我想要通用和合并的列标题。
    • 我还有一个问题要发帖
    猜你喜欢
    • 2019-08-06
    • 2012-08-31
    • 1970-01-01
    • 2020-06-15
    • 1970-01-01
    • 2018-06-15
    • 2021-05-29
    • 2023-02-06
    • 1970-01-01
    相关资源
    最近更新 更多