根据字母排序列(A00,B00,AA0,AB0,BA0等)。

3

我有一个包含字母值的数据帧。我想按照下面详细说明的字母顺序对其进行排序。 我输入的内容如下:

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

所有字符串长度相同吗? - Corralien
@Corralien 是的,它们都有相同的长度。 - Ashish
3个回答

6

你可以使用extract提取字母并在左侧用zfill(或rjust)填充0,然后将其作为key用于sort_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

我用 'AAAA0' 进行了测试,它也能正常工作。看起来这就是答案。 - Laurent B.
这个非常奇妙 :)。 - Ashish

1

另一种可能的解决方案:

(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

0
这里有另一个解决方案:
首先按列进行排序,然后根据字符串中找到的字母长度进行第二次排序。
(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

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