使用sort_index时的关键功能

问题描述

我无法理解对Series的索引进行排序时关键功能是如何工作的。 例如,我有这样的系列:

(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()的文档中,据说键函数应该接收一个序列并返回一个序列。那么它在这里如何工作?对列表进行排序并更改其索引无济于事,因为值与原始索引分离。

这就是我使用列表的方式。这是DataFrame。早些时候我创建了pay_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系列的索引中创建了一个列表,并使用分区对'('和','之间的数字进行了排序

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. str.extract()上临时创建带有正则表达式(index)的新列。如果您使用方括号而不是括号,请将单引号)之前的最后一个'更改为]
  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