簡體   English   中英

在 Pandas 中對帶有數字的字符串列進行排序

[英]Sort string columns with numbers in it in Pandas

我想按列排序我的桌子。 該列是一個包含數字的字符串,例如 ASH11、ASH2、ASH1 等。問題是使用方法sort_values將執行“字符”順序,因此示例中的列將是這樣的順序--> ASH1、ASH11、ASH2。 我想要這樣的順序--> AS20H1、AS20H2、AS20H11(考慮到最后一個數字)。

我雖然想取字符串的最后一個字符,但有時只是最后一個,在其他情況下是最后兩個。 另一種方法(從開頭獲取字符)也不起作用,因為字符串並不總是來自相同的長度(即某些情況下名稱是 ASH1、ASGH22、ASHGT3 等)

使用key參數( 1.1.0新增)

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

您可以從列中提取整數,然后使用它對您的 dataFrame 進行排序

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

如果您在“new_index”列中得到一些 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)'匹配字符串中的最后一個數字

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM