пользовательская сортировка данных(алфавитная целочисленная) в фрейме данных pandas

#python #pandas #dataframe #sorting

Вопрос:

У меня есть фрейм данных, в котором мне нужно отсортировать содержимое одного столбца (через запятую) (в алфавитном порядке нумерация) :

Ввод : —

       Invoice Number
0     IN-2
1     IN-1
2     IN-5
3     IN-20
4     IN-10
 

Я хочу, чтобы результат был таким

       Invoice Number
0     IN-1
1     IN-2
2     IN-5
3     IN-10
4     IN-20
 

Я пытался

df.значения сортировки(by=[‘Номер счета-фактуры’])

Но все уладилось :

       Invoice Number
0     IN-1
1     IN-10
2     IN-2
3     IN-20
4     IN-5
 

Если кто-нибудь знает, как сортировать мои данные (буквенное целочисленное) значение, так скажите мне.

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

1. В вашем случае панды сортируются по каждому отдельному символу в вашем столбце. Можно было бы отделить строку»В -» от числа в новом столбце, а затем отсортировать столбец с числами.

Ответ №1:

Вы можете просто воспользоваться key опцией sort_values :

 df.sort_values(by='Number', key=lambda x: x.str[3:].astype(int))
 

Что он делает, так это избавляется от части «В-» и преобразуется в int.

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

1. Во всех строках нет IN-xxx, это может быть RHKW-xxx или AMH-xxx, что угодно в алфавите.

Ответ №2:

Попробуйте использовать колонку с держателем места:

 df['_'] = df['Invoice Number'].str.split('-').str[1].astype(int)
print(df.sort_values('_').drop('_', axis=1).reset_index(drop=True))
 

Или с key аргументом:

 print(df.sort_values('Invoice Number', key=lambda x: x.str.split('-').str[1].astype(int))
 

Вывод обоих кодов:

   Invoice Number
0           IN-1
1           IN-2
2           IN-5
3          IN-10
4          IN-20
 

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

1. lambda x: int(x.str[3:]) не будет работать как x.str[3:] ряд, а не скаляр.

2. @mozway, который я использовал split сейчас, так отличается от вашего кода, проверьте это

3. Я как раз собирался добавить вариант разделения 😉

4. Возможно, вы можете прокомментировать тот факт, что вариант разделения будет работать, даже если часть перед «-» является переменной

Ответ №3:

natsort полезно в таких ситуациях:

 import pandas as pd
from natsort import natsort_key

df = pd.DataFrame({'Invoice': {0: 0, 1: 1, 2: 2, 3: 3, 4: 4},
                   'Number': {0: 'IN-2', 1: 'IN-1', 2: 'IN-5', 3: 'IN-20',
                              4: 'IN-10'}})

df = df.sort_values('Number', key=natsort_key)
 

df :

    Invoice Number
1        1   IN-1
0        0   IN-2
2        2   IN-5
4        4  IN-10
3        3  IN-20
 

Более интересный пример:

 df = pd.DataFrame({'Invoice': {0: 0, 1: 1, 2: 2, 3: 3, 4: 4},
                   'Number': {0: 'RHKW-11', 1: 'AB-1', 2: 'IN-5', 3: 'IN-20',
                              4: 'RHKW-102'}})
 

df :

    Invoice    Number
0        0   RHKW-11
1        1      AB-1
2        2      IN-5
3        3     IN-20
4        4  RHKW-102
 

df = df.sort_values('Number', key=natsort_key) :

    Invoice    Number
1        1      AB-1
2        2      IN-5
3        3     IN-20
0        0   RHKW-11
4        4  RHKW-102