在熊猫中对带有数字的字符串列进行排序

时间:2020-08-13 15:52:34

标签: python pandas

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

尽管我采用的是字符串的最后一个字符,但有时只会是最后一个,在其他情况下则是最后两个。另一种方法(从开始字符中提取字符)不起作用,因为字符串并非总是来自相同的长度(即,在某些情况下,名称为ASH1,ASGH22,ASHGT3等)

3 个答案:

答案 0 :(得分:1)

使用key参数(1.1.0中的新参数)

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

答案 1 :(得分:0)

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

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

如果您在“ new_index”列中获得一些NA,则可以在sort_values方法中使用选项na_position以便选择将它们放置在何处(开始或结束)

答案 2 :(得分:0)

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

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