【问题标题】:Key function when using sort_index()使用 sort_index() 时的关键函数
【发布时间】:2021-01-17 12:10:06
【问题描述】:

我无法理解在对 Series 的索引进行排序时 key 函数是如何工作的。 例如我有这样的系列:

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

这就是我使用列表的方式。这是数据框。之前我创建了工资箱来为每个工资设置一个间隔。

  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 是 Series 类型

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]']

所以我了解 key 在列表情况下的工作原理。我们有一个列表元素,而不是 x。但是当我尝试对 sort_series() 使用键功能时,我无法得到任何明智的结果。当 x 是一个系列时,我不明白在函数中使用 x 执行什么操作。

【问题讨论】:

  • 你能附上你尝试过的代码吗?
  • 添加了一个带有列表的部分,但系列没有什么好处
  • @Duck 我的回答与你的方法有点不同,但它仍然应该满足你的需要而不重置索引?
  • @David Erickson 是的,这将帮助我解决我的问题,谢谢
  • 分享代码会有帮助;另一种选择是使用 python 的 sorted 函数对索引进行排序:df.reindex(sorted(df.index, key=lambda x: x[0]))

标签: python pandas dataframe sorting series


【解决方案1】:

你可以:

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

【讨论】:

  • 由于 lambda 函数中的 x 值需要被视为索引对象,这对我来说很好:key=lambda x: x.astype(int)
猜你喜欢
  • 1970-01-01
  • 2022-06-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-11-10
  • 1970-01-01
  • 2016-07-18
相关资源
最近更新 更多