【问题标题】:rearrange multiple columns based on the indices根据索引重新排列多列
【发布时间】:2020-10-15 07:22:22
【问题描述】:

我有一个包含列的数据框

['ID_slice-0010-EDSR_x2', 'slice-0010-EDSR_x2_X', 'slice-0010-EDSR_x2_Y','slice-0011-EDSR_x2_X', 'slice-0011-EDSR_x2_Y','slice-0012-EDSR_x2_X', 'slice-0012-EDSR_x2_Y','slice-0013-EDSR_x2_X', 'slice-0013-EDSR_x2_Y','slice-0014-EDSR_x2_X', 'slice-0014-EDSR_x2_Y','slice-0015-EDSR_x2_X', 'slice-0015-EDSR_x2_Y','slice-0016-EDSR_x2_X', 'slice-0016-EDSR_x2_Y','slice-0017-EDSR_x2_X', 'slice-0017-EDSR_x2_Y','slice-0018-EDSR_x2_X', 'slice-0018-EDSR_x2_Y','ID_slice-0011-EDSR_x2', 'ID_slice-0012-EDSR_x2','ID_slice-0013-EDSR_x2', 'ID_slice-0014-EDSR_x2','ID_slice-0015-EDSR_x2', 'ID_slice-0016-EDSR_x2','ID_slice-0017-EDSR_x2', 'ID_slice-0018-EDSR_x2']

因为以 ID 开头的列在最后,它应该在特定的位置。所以我想重新排列它像这样

['ID_slice-0010-EDSR_x2','slice-0010-EDSR_x2_X', 'slice-0010-EDSR_x2_Y', 'ID_slice-0011-EDSR_x2','slice-0011-EDSR_x2_X','slice-0011-EDSR_x2_Y', 'ID_slice-0012-EDSR_x2','slice-0012-EDSR_x2_X','slice-0012-EDSR_x2_Y', 'ID_slice-0013-EDSR_x2','slice-0013-EDSR_x2_X','slice-0013-EDSR_x2_Y', 'ID_slice-0014-EDSR_x2','slice-0014-EDSR_x2_X','slice-0014-EDSR_x2_Y', 'ID_slice-0015-EDSR_x2','slice-0015-EDSR_x2_X','slice-0015-EDSR_x2_Y', 'ID_slice-0016-EDSR_x2','slice-0016-EDSR_x2_X','slice-0016-EDSR_x2_Y', 'ID_slice-0017-EDSR_x2','slice-0017-EDSR_x2_X','slice-0017-EDSR_x2_Y', 'ID_slice-0018-EDSR_x2'、'slice-0018-EDSR_x2_X'、'slice-0018-EDSR_x2_Y']

我尝试使用该方法,但它变成静态的,所以我想使用一些东西

In [7]: cols = df.columns.tolist()
In [8]: cols
Out[8]: [0L, 1L, 2L, 3L, 4L, 'mean']

In [12]: cols = cols[-1:] + cols[:-1]

In [13]: cols
Out[13]: ['mean', 0L, 1L, 2L, 3L, 4L]
  
In [14]: df = df[cols] 

这是我尝试过的

finaldf = finaldf[['ID_slice-0010-EDSR_x2','slice-0010-EDSR_x2_X', 'slice-0010-EDSR_x2_Y', 
                   'ID_slice-0011-EDSR_x2','slice-0011-EDSR_x2_X', 'slice-0011-EDSR_x2_Y', 
                   'ID_slice-0012-EDSR_x2','slice-0012-EDSR_x2_X', 'slice-0012-EDSR_x2_Y', 
                   'ID_slice-0013-EDSR_x2','slice-0013-EDSR_x2_X', 'slice-0013-EDSR_x2_Y', 
                   'ID_slice-0014-EDSR_x2','slice-0014-EDSR_x2_X', 'slice-0014-EDSR_x2_Y', 
                   'ID_slice-0015-EDSR_x2','slice-0015-EDSR_x2_X', 'slice-0015-EDSR_x2_Y', 
                   'ID_slice-0016-EDSR_x2','slice-0016-EDSR_x2_X', 'slice-0016-EDSR_x2_Y', 
                   'ID_slice-0017-EDSR_x2','slice-0017-EDSR_x2_X', 'slice-0017-EDSR_x2_Y', 
                   'ID_slice-0018-EDSR_x2','slice-0018-EDSR_x2_X', 'slice-0018-EDSR_x2_Y']]
finaldf.to_csv("id.csv",index=False)

【问题讨论】:

    标签: python pandas dataframe multiple-columns


    【解决方案1】:

    使用 sorted by lambda 按由 split 创建的整数进行排序,并将最后一个 x2 替换为 x2_ 以便在最后一个 _ 之后按值正确排序:

    import re
    
    new = sorted(cols, key=lambda x:(int(x.split('-')[1]),re.sub('x2$','x2_',x).split('_')[-1]))
    print (new[:6])
    ['ID_slice-0010-EDSR_x2', 'slice-0010-EDSR_x2_X', 'slice-0010-EDSR_x2_Y', 
     'ID_slice-0011-EDSR_x2', 'slice-0011-EDSR_x2_X', 'slice-0011-EDSR_x2_Y']
    

    Pandas 解决方案创建 2 个辅助列进行排序:

    df = pd.DataFrame({'c': cols})
    df['a'] = df['c'].str.split('-').str[1].astype(int)
    df['b'] = np.where(df['c'].str.endswith('x2'), 'A', df['c'].str.split('_').str[-1])
    
    df = df.sort_values(['a','b'])
    print (df.head(6))
                            c   a  b
    0   ID_slice-0010-EDSR_x2  10  A
    1    slice-0010-EDSR_x2_X  10  X
    2    slice-0010-EDSR_x2_Y  10  Y
    19  ID_slice-0011-EDSR_x2  11  A
    3    slice-0011-EDSR_x2_X  11  X
    4    slice-0011-EDSR_x2_Y  11  Y
    
    new = df['c'].tolist()
    print (new[:6])
    ['ID_slice-0010-EDSR_x2', 'slice-0010-EDSR_x2_X', 'slice-0010-EDSR_x2_Y', 
     'ID_slice-0011-EDSR_x2', 'slice-0011-EDSR_x2_X', 'slice-0011-EDSR_x2_Y']
    

    【讨论】:

      猜你喜欢
      • 2017-03-27
      • 2018-10-28
      • 2020-12-28
      • 2021-05-12
      • 2018-04-15
      • 2014-11-29
      • 2017-05-23
      • 1970-01-01
      • 2021-12-24
      相关资源
      最近更新 更多