为了账号安全,请及时绑定邮箱和手机立即绑定

合并两个列标题并在多索引数据帧 python/在列名称上方添加列中指定新名称

合并两个列标题并在多索引数据帧 python/在列名称上方添加列中指定新名称

富国沪深 2023-07-05 10:31:57
我有初始数据框:              r_id1   r_score1    rid2     r_score2RankID1    ID21      A-1    id-1      1.23      id-34      6.782      A-1    id-9      2.34      id-45      3.453      A-2    id-8      3.56      id-32      4.564      A-3    id-6      4.35      id-10      3.985      A-4    id-4      7.89      id-67      2.98我希望我的数据框是(Result_df):                 Score_R1              Score_R2             r_id1   r_score1     rid2     r_score2ID1    ID21      A-1    id-1      1.23      id-34      6.782      A-1    id-9      2.34      id-45      3.453      A-2    id-8      3.56      id-32      4.564      A-3    id-6      4.35      id-10      3.985      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_score21      A-1    id-1      1.23      id-34      6.782      A-1    id-9      2.34      id-45      3.453      A-2    id-8      3.56      id-32      4.564      A-3    id-6      4.35      id-10      3.985      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_score2ID1    ID21      A-1    id-1      1.23      id-34      6.782      A-1    id-9      2.34      id-45      3.453      A-2    id-8      3.56      id-32      4.564      A-3    id-6      4.35      id-10      3.985      A-4    id-4      7.89      id-67      2.98我需要合并具有相同名称的列标题                Score_R1               Score_R2                r_id1   r_score1     rid2     r_score2ID1    ID21      A-1    id-1      1.23      id-34      6.782      A-1    id-9      2.34      id-45      3.45
查看完整描述

1 回答

?
慕妹3242003

TA贡献1824条经验 获得超6个赞

您可以用于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')],

           )


查看完整回答
反对 回复 2023-07-05
  • 1 回答
  • 0 关注
  • 90 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信