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

piR*_*red 4 python sorting pandas

考虑数据帧 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
Run Code Online (Sandbox Code Playgroud)

我想重新排列列,使得元音在辅音之前出现,否则按字母顺序排列.

我可以按字母顺序对列进行排序 sort_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
Run Code Online (Sandbox Code Playgroud)

但是这'E'不合时宜.
我可以"手动"得到我想要的东西

df[list('AEBCS')]

    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
Run Code Online (Sandbox Code Playgroud)

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

cs9*_*s95 6

你需要sorted+ reindex.

df.reindex(columns=[
    x[1] for x in sorted(zip(~df.columns.isin(list('AEIOU')), df.columns))
])
Run Code Online (Sandbox Code Playgroud)

sorted如果你传递一个由生成的元组的列表/容器,将对多个谓词进行排序zip.

或者,采用piR的建议并使用a lambda来排序:

df.reindex(
    columns=sorted(df.columns, key=lambda x: (x not in 'AEIOU', x))
)
Run Code Online (Sandbox Code Playgroud)

    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
Run Code Online (Sandbox Code Playgroud)

  • 我喜欢.与我的想法不同. (3认同)