为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

慕工程0101907 2023-05-23 14:50:05
我想按列排序我的表。该列是一个包含数字的字符串,例如 ASH11、ASH2、ASH1 等。问题是使用方法sort_values将执行“字符”排序,因此示例中的列将像这样排序--> ASH1,ASH11,ASH2。我想要这样的顺序 --> AS20H1、AS20H2、AS20H11(考虑到最后一个数字)。我虽然考虑了字符串的最后一个字符,但有时只是最后一个,在其他情况下是最后两个。反过来(从开头获取字符)也不起作用,因为字符串并不总是来自相同的长度(即在某些情况下名称为 ASH1、ASGH22、ASHGT3 等)
查看完整描述

3 回答

?
湖上湖

TA贡献2003条经验 获得超2个赞

使用key参数(新增1.1.0

df.sort_values(by=['xxx'], key=lambda col: col.map(lambda x: int(re.split('(\d+)',x)[-2])))


查看完整回答
反对 回复 2023-05-23
?
慕容森

TA贡献1853条经验 获得超18个赞

使用列表理解和正则表达式:


>>> import pandas as pd

>>> import re #Regular expression


>>> a = pd.DataFrame({'label':['AS20H1','AS20H2','AS20H11','ASH1','ASGH22','ASHGT3']})

>>> a

     label

0   AS20H1

1   AS20H2

2  AS20H11

3     ASH1

4   ASGH22

5   ASHGT3

r'(\d+)(?!.*\d)' 匹配字符串中的最后一个数字


>>> a['sort_int'] = [ int(re.search(r'(\d+)(?!.*\d)',i).group(0)) for i in a['label']]

>>> a

     label  sort_int

0   AS20H1         1

1   AS20H2         2

2  AS20H11        11

3     ASH1         1

4   ASGH22        22

5   ASHGT3         3


>>> a.sort_values(by='sort_int',ascending=True)

     label  sort_int

0   AS20H1         1

3     ASH1         1

1   AS20H2         2

5   ASHGT3         3

2  AS20H11        11

4   ASGH22        22


查看完整回答
反对 回复 2023-05-23
?
慕慕森

TA贡献1856条经验 获得超17个赞

您可以从列中提取整数,然后使用它对数据帧进行排序

  df["new_index"] = df.yourColumn.str.extract('(\d+)')
  df.sort_values(by=["new_index"], inplace=True)

如果您在“new_index”列中得到一些 NA,您可以在 sort_values 方法中使用选项 na_position 来选择放置它们的位置(开始或结束)


查看完整回答
反对 回复 2023-05-23
  • 3 回答
  • 0 关注
  • 232 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信