#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