pandas 根据字母表(A00、B00、AA0、AB0、BA0等)对列进行排序

rqenqsqc  于 2023-03-21  发布在  其他
关注(0)|答案(3)|浏览(210)

我有一个字母值的dataframe。我想根据字母排序,如下所述。输入我有:

A00
B00
AA0
BA0
AB0
C00
Z00

我需要的输出:

A00
B00
C00
Z00
AA0
AB0
BA0

问题是,使用sort_values,我得到下面的输出,因为值是基于第一个字母表排序的,AA0和AB0在A00之后,BA0在B00之后。我希望在Z00之后有这些:

A00
AA0
AB0
B00
BA0
C00
Z00
niwlg2el

niwlg2el1#

您可以extract字母,并在左边用zfill(或rjust)填充它们,然后将其用作keysort_values

out = df.sort_values(by='col', key=lambda s: s.str.extract('([a-zA-Z]+)', expand=False).str.zfill(10))

输出:

col
0  A00
1  B00
5  C00
6  Z00
2  AA0
4  AB0
3  BA0

中间体:

df['col'].str.extract('([a-zA-Z]+)', expand=False).str.zfill(10)

0    000000000A
1    000000000B
2    00000000AA
3    00000000BA
4    00000000AB
5    000000000C
6    000000000Z
Name: col, dtype: object

使用rjust

df['col'].str.extract('([a-zA-Z]+)', expand=False).str.rjust(10)

0             A
1             B
2            AA
3            BA
4            AB
5             C
6             Z
Name: col, dtype: object
wdebmtf2

wdebmtf22#

另一种可能的解决方案:

(df.join(df['col'].str.split(r'(?<=\D)(?=\d)', regex=True, expand=True))
 .assign(aux=lambda x: x[1]+x[0])
 .sort_values('aux')['col'].to_frame())

输出:

col
0  A00
1  B00
5  C00
6  Z00
2  AA0
4  AB0
3  BA0
w6lpcovy

w6lpcovy3#

下面是另一个解决方案:
首先我们按列排序,然后根据字符串中找到的字母的长度进行第二次排序

(df.sort_values('col')
.sort_values('col',key = lambda x: x.str.findall(r'[A-Za-z]').str.len()))

输出:

col
0  A00
1  B00
5  C00
6  Z00
2  AA0
4  AB0
3  BA0

相关问题