按单个字符名称排序列,以元音字母为首。

4
考虑数据框架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_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' 顺序错乱。
我可以手动获取我想要的内容。
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

如何动态地做到这一点,考虑到我并不知道确切的字母是什么?我知道它们是单个字符的ASCII大写字母。


3
你需要在白天早些时候问这些问题。到了晚上这个时间点,这些问题让我感到头疼。 - Stephen Rauch
4
@StephenRauch 很不体贴。 - piRSquared
你在 df.sort_index() 中漏掉了 axis=1 吗? - Sohaib Farooqi
@bro-grammer 是的,我做了。谢谢。 - piRSquared
3
@Downvoter,请解释一下这个问题为什么太宽泛。这个问题非常相关,并且解释得很清楚。我给一个赞。 - cs95
1个回答

6
您需要进行排序重新索引操作。
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))
)

    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

3
我喜欢它。与我之前想的不同。 - piRSquared
1
sorted(df.columns, key=lambda x: (x not in 'AEIOU', x)) - piRSquared

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接