python - 根据索引重新排列多列
问题描述
我有一个包含列的数据框
['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)
解决方案
使用 sorted by lambda 按创建的整数排序,split
并替换 lastx2
以x2_
按 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']
推荐阅读
- apk - 为什么 APK 没有在 Monaca.io 中加载
- sql-server - 带有 WAITFOR DELAY 的过程直到最后才会执行
- arrays - Arduino:将字符串数组转换为字节数组
- python - 无法在 Selenium 中删除 headers-first XPATH
- bash - Matlab parfor 使用的内核数少于分配的内核数
- python - python colab笔记本不打印?
- python - 有没有办法可以打印我在单行上转换的输入的输出?
- algorithm - 验证图中的最小生成树
- javascript - 如何让我的牌完全洗牌?
- c++ - 我必须在我的程序中写什么,以便它只接受正确位置的逗号(即不能输入 10,00.0、100,0.2334 等)?