我有一个字母值的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
niwlg2el1#
您可以extract字母,并在左边用zfill(或rjust)填充它们,然后将其用作key到sort_values:
extract
zfill
rjust
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
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())
w6lpcovy3#
下面是另一个解决方案:首先我们按列排序,然后根据字符串中找到的字母的长度进行第二次排序
(df.sort_values('col') .sort_values('col',key = lambda x: x.str.findall(r'[A-Za-z]').str.len()))
3条答案
按热度按时间niwlg2el1#
您可以
extract
字母,并在左边用zfill
(或rjust
)填充它们,然后将其用作key
到sort_values
:输出:
中间体:
使用
rjust
:wdebmtf22#
另一种可能的解决方案:
输出:
w6lpcovy3#
下面是另一个解决方案:
首先我们按列排序,然后根据字符串中找到的字母的长度进行第二次排序
输出: