Ключевая функция при использовании sort_index()

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

Вы можете:

  1. временно создайте новый столбец с некоторым регулярным выражением ( str.extract() ) в index . Измените последнюю ) перед одинарной кавычкой ' на a ] , если у вас есть скобка вместо круглой скобки
  2. сортировка по этому временному столбцу
  3. и удалите ненужный столбец

 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)