首页 > 解决方案 > 根据索引重新排列多列

问题描述

我有一个包含列的数据框

['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)

标签: pythonpandasdataframemultiple-columns

解决方案


使用 sorted by lambda 按创建的整数排序,split并替换 lastx2x2_按 last 之后的值正确排序_

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']

推荐阅读