Сортировка строк по столбцам с числами в них в Pandas

#python #pandas

#python #pandas

Вопрос:

Я хочу упорядочить свою таблицу по столбцу. Столбец представляет собой строку, в которой есть числа, например ASH11, ASH2, ASH1 и т.д. Проблема в том, что при использовании метода sort_values будет использоваться порядок «символов», поэтому столбцы из примера будут располагаться в таком порядке -> ASH1, ASH11, ASH2. И я хочу, чтобы порядок был таким -> AS20H1, AS20H2, AS20H11 (с учетом последнего числа).

Я думал о том, чтобы брать последние символы строки, но иногда это были бы только последние, а в других случаях — последние два. Другой способ (использование символов с самого начала) также не работает, потому что строки не всегда имеют одинаковую длину (т. Е. в некоторых случаях имя ASH1, ASGH22, ASHGT3 и т.д.)

Комментарии:

1. Natsort

Ответ №1:

Используйте key параметр (новый в 1.1.0 )

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

Ответ №2:

Используя понимание списка и регулярное выражение:

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

Ответ №3:

Возможно, вы могли бы извлечь целые числа из своего столбца, а затем использовать его для сортировки вашего фрейма данных

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

В случае, если вы получаете некоторое количество NA в вашем столбце «new_index», вы можете использовать параметр na_position в методе sort_values, чтобы выбрать, куда их поместить (начало или конец)