问题描述
我无法理解对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在函数中执行什么操作。
解决方法
您可以:
- 在
str.extract()
上临时创建带有正则表达式(index
)的新列。如果您使用方括号而不是括号,请将单引号)
之前的最后一个'
更改为]
- 按此临时列排序
- 并删除不必要的列
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