Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/jquery-ui/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
合并两个列标题并在多索引数据框python中指定新名称/在列名上方添加列_Python_Python 3.x_Pandas_Dataframe_Multi Index - Fatal编程技术网

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

合并两个列标题并在多索引数据框python中指定新名称/在列名上方添加列,python,python-3.x,pandas,dataframe,multi-index,Python,Python 3.x,Pandas,Dataframe,Multi Index,我有初始数据帧: 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

我有初始数据帧:

              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):

我的dataframe是多索引的,具有多索引列。 我试过这段代码

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
您可以使用从列名称中获取数字、添加前缀以及最后一次使用原始列为列中的
多索引赋值

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()之后或之前?生成错误
“只能使用带索引的.str访问器,而不是多索引的”属性错误:只能使用带索引的.str访问器,而不是多索引的.str访问器
[('r_-id1','',('r_-score1','')('r_-id2','')('r_-score2','')]
Score\u R1
r-id1和r\u score1两列的列标题。我想要公共列标题和合并列标题。我还有一个问题要问
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')],
           )