#python #pandas #dataframe #sorting #series
#python #панды #фрейм данных #сортировка #Серии
Вопрос:
Я не могу понять, как работает ключевая функция при сортировке индексов ряда. Например, у меня есть такая серия:
(0, 4) k
(12, 16) a
(24, 28) b
(4, 8) f
(8, 12) g
и я хочу, чтобы индексы были в следующем порядке:
(0, 4)
(4, 8)
(8, 12)
(12, 16)
(24, 28)
Это не кортежи, а просто строки. Когда я сортирую его как список, я просто создаю ключевую функцию, и для каждого элемента она возвращает первое число, по которому сортируются элементы. Но в документации к sort_index() сказано, что ключевая функция должна получать серию и возвращать серию. Итак, как это работает здесь? Сортировка списка и изменение индексов в нем не помогают, поскольку значения отделяются от исходных индексов.
Вот как я работал со списком. Вот фрейм данных. Ранее я создал wage_bin, чтобы сделать интервал для каждой заработной платы.
person col2 col3 wage wage_bin
0 a 5 g 4 (0,4]
1 b 3 e 14 (12,16]
2 c 4 e 25 (24,28]
3 d 8 p 9 (8,12]
4 a 1 s 5 (4,8]
5 d 6 x 12 (8,12]
g, как я понимаю, является типом серии
g = df.groupby('wage_bin').size()
wage_bin
(0,4] 1
(12,16] 1
(24,28] 1
(4,8] 1
(8,12] 2
dtype: int64
Здесь я составил список из индексов серии g и отсортировал с помощью partition, чтобы взять число между ‘(‘ и ‘,’
k = list(g.index)
k.sort(key=lambda x: int(x.partition('(')[2].partition(',')[0]))
print(k)
['(0,4]', '(4,8]', '(8,12]', '(12,16]', '(24,28]']
итак, я понимаю, как работает ключ в случае списка. Вместо x у нас есть элемент списка. Но я не смог получить ничего разумного, когда попытался использовать ключевую функцию для sort_series(). Я не понимаю, что выполнять с x в функции, когда x является серией.
Комментарии:
1. Можете ли вы включить код того, что вы пробовали?
2. Добавлена часть со списком, но ничего хорошего с серией
3. @Duck мой ответ немного отличается от вашего подхода, но он все равно должен соответствовать вашим потребностям без сброса индекса?
4. @Дэвид Эриксон да, это поможет мне решить мою проблему, спасибо
5. было бы полезно поделиться кодом; другим вариантом было бы отсортировать индекс с
sorted
помощью функции python :df.reindex(sorted(df.index, key=lambda x: x[0]))
Ответ №1:
Вы можете:
- временно создайте новый столбец с некоторым регулярным выражением (
str.extract()
) вindex
. Измените последнюю)
перед одинарной кавычкой'
на a]
, если у вас есть скобка вместо круглой скобки - сортировка по этому временному столбцу
- и удалите ненужный столбец
import pandas as pd
df = pd.DataFrame({'A': {0: '(0, 4)', 1: '(12, 16)', 2: '(24, 28)', 3: '(4, 8)', 4: '(8, 12)'},
'B': {0: 'k', 1: 'a', 2: 'b', 3: 'f', 4: 'g'}}).set_index('A')
df['C'] = df.index.str.extract(',s (d ))').astype(int)
df = df.sort_values('C').drop('C',axis=1)
df
Out[1]:
B
A
(0, 4) k
(4, 8) f
(8, 12) g
(12, 16) a
(24, 28) b
Комментарии:
1. Поскольку значение x в лямбда-функции должно обрабатываться как индексный объект, для меня это сработало нормально:
key=lambda x: x.astype(int)