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

2024-05-23 16:23:14 发布

您现在位置:Python中文网/ 问答频道 /正文

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

我考虑过使用字符串的最后一个字符,但有时只是最后一个字符,在其他情况下是最后两个字符。另一种方法(从Begging中提取字符)也不起作用,因为字符串并不总是来自同一长度(例如,在某些情况下,名称是ASH1、ASGH22、ASHGT3等)


Tags: 方法字符串订单gt示例排序顺序情况
3条回答

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

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

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

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

>>> 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)' Matches the last number in a string

>>> 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

使用key参数(在1.1.0中新增)

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

相关问题 更多 >