猿问

在 Pandas 中对包含数字的字符串列进行排序

我想按列排序我的表。该列是一个包含数字的字符串,例如 ASH11、ASH2、ASH1 等。问题是使用方法sort_values将执行“字符”排序,因此示例中的列将像这样排序--> ASH1,ASH11,ASH2。我想要这样的顺序 --> AS20H1、AS20H2、AS20H11(考虑到最后一个数字)。

我虽然考虑了字符串的最后一个字符,但有时只是最后一个,在其他情况下是最后两个。反过来(从开头获取字符)也不起作用,因为字符串并不总是来自相同的长度(即在某些情况下名称为 ASH1、ASGH22、ASHGT3 等)


慕工程0101907
浏览 233回答 3
3回答

湖上湖

使用key参数(新增1.1.0)df.sort_values(by=['xxx'], key=lambda col: col.map(lambda x: int(re.split('(\d+)',x)[-2])))

慕容森

使用列表理解和正则表达式:>>> import pandas as pd>>> import re #Regular expression>>> a = pd.DataFrame({'label':['AS20H1','AS20H2','AS20H11','ASH1','ASGH22','ASHGT3']})>>> a     label0   AS20H11   AS20H22  AS20H113     ASH14   ASGH225   ASHGT3r'(\d+)(?!.*\d)' 匹配字符串中的最后一个数字>>> a['sort_int'] = [ int(re.search(r'(\d+)(?!.*\d)',i).group(0)) for i in a['label']]>>> a     label  sort_int0   AS20H1         11   AS20H2         22  AS20H11        113     ASH1         14   ASGH22        225   ASHGT3         3>>> a.sort_values(by='sort_int',ascending=True)     label  sort_int0   AS20H1         13     ASH1         11   AS20H2         25   ASHGT3         32  AS20H11        114   ASGH22        22

慕慕森

您可以从列中提取整数,然后使用它对数据帧进行排序  df["new_index"] = df.yourColumn.str.extract('(\d+)')   df.sort_values(by=["new_index"], inplace=True)如果您在“new_index”列中得到一些 NA,您可以在 sort_values 方法中使用选项 na_position 来选择放置它们的位置(开始或结束)
随时随地看视频慕课网APP

相关分类

Python
我要回答