Python 首先按单个字符名称和元音对列进行排序

Python 首先按单个字符名称和元音对列进行排序,python,pandas,sorting,Python,Pandas,Sorting,考虑数据帧df df = pd.DataFrame(np.arange(25).reshape(5, 5), columns=list('CBESA')) df C B E S A 0 0 1 2 3 4 1 5 6 7 8 9 2 10 11 12 13 14 3 15 16 17 18 19 4 20 21 22 23 24 我想重新排列这些列,使元音排在辅音之前,否则按字母顺序排列 我可以使用

考虑数据帧
df

df = pd.DataFrame(np.arange(25).reshape(5, 5), columns=list('CBESA'))
df

    C   B   E   S   A
0   0   1   2   3   4
1   5   6   7   8   9
2  10  11  12  13  14
3  15  16  17  18  19
4  20  21  22  23  24
我想重新排列这些列,使元音排在辅音之前,否则按字母顺序排列

我可以使用
sort\u index

df.sort_index(1)

    A   B   C   E   S
0   4   1   0   2   3
1   9   6   5   7   8
2  14  11  10  12  13
3  19  16  15  17  18
4  24  21  20  22  23
但是这使得
'E'
失去了秩序。
我可以“手动”得到我想要的东西


考虑到我不知道确切的字母,我该怎么做?我知道它们是单字符ascii大写字母。

您需要排序的
索引

df.reindex(columns=[
    x[1] for x in sorted(zip(~df.columns.isin(list('AEIOU')), df.columns))
])
sorted
将在多个谓词上排序,如果您向其传递一个使用
zip
生成的元组列表/容器

或者,采纳piR的建议,并使用
lambda
进行排序:

df.reindex(
    columns=sorted(df.columns, key=lambda x: (x not in 'AEIOU', x))
)


你需要在今天早些时候问这些问题。晚上的这个时候,这些东西伤了我的大脑…@Stephenrouch我太不体贴了。你在
df.sort_index()
中错过了
axis=1
?@brogrammer是的,我错过了。thanks@Downvoter,请解释为什么这太宽泛了。这个问题完全符合主题,而且解释得很好+我很喜欢。与我的想法不同。
排序(df.columns,key=lambda x:(x不在'AEIOU',x')
df.reindex(
    columns=sorted(df.columns, key=lambda x: (x not in 'AEIOU', x))
)
    A   E   B   C   S
0   4   2   1   0   3
1   9   7   6   5   8
2  14  12  11  10  13
3  19  17  16  15  18
4  24  22  21  20  23