首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >合并两个列标题并在MultiIndex Dataframe python/在列名上方添加列中指定一个新名称

合并两个列标题并在MultiIndex Dataframe python/在列名上方添加列中指定一个新名称
EN

Stack Overflow用户
提问于 2020-09-01 11:39:47
回答 1查看 151关注 0票数 2

我有初始数据帧:

代码语言:javascript
复制
              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):

代码语言:javascript
复制
                 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

我的数据帧是多索引的,具有multiindex列。我试过这段代码

代码语言:javascript
复制
final_df.columns = [' '.join(col).strip() for col in final_df.columns.values]

这给出了下面的输出

代码语言:javascript
复制
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

之后:

代码语言:javascript
复制
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")

输出为:

代码语言:javascript
复制
             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

我需要组合具有相同名称的列标题

代码语言:javascript
复制
                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
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-09-01 14:37:12

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

代码语言:javascript
复制
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

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

代码语言:javascript
复制
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')],
           )
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63681031

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档