我有一个包含字母值的数据帧。我想按照下面详细说明的字母顺序对其进行排序。 我输入的内容如下:
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
我有一个包含字母值的数据帧。我想按照下面详细说明的字母顺序对其进行排序。 我输入的内容如下:
A00
B00
AA0
BA0
AB0
C00
Z00
我需要的输出:
A00
B00
C00
Z00
AA0
AB0
BA0
A00
AA0
AB0
B00
BA0
C00
Z00
你可以使用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
另一种可能的解决方案:
(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
(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