如何正确使用operator.itemgetter进行双重排序

时间:2017-09-06 20:34:05

标签: python pandas sorting dataframe

我正在尝试使用itemgetter在python中进行双重排序,但我似乎无法掌握它。我想要做的是先按照' var2'排序。然后由' var4',但保持按' var2'排序。我有以下应该有用的代码(我从另一个SO问题改编而来):

df = df[['var1', 'var2', 'var3', 'var4']]
df = sorted(df, key=operator.itemgetter(1,2))

但我不确定这些参数对于itemgetter意味着什么。我尝试按原样运行它,但我得到的只是变量'名。

我也尝试过做

df = sorted(df, key=operator.itemgetter(2,4))

但是我收到以下错误:' IndexError:字符串索引超出范围'。

请帮忙。

编辑:示例

我有四个变量:日期,时间,价格和数字。我想按日期对数据框进行排序,但在每个日期内我想按数字对其进行排序。我希望这是有道理的。

date            time        price   number

09/02/2008  00:20:38    46.0    9987

09/03/2009  07:00:49    46.65   8551

07/05/2008  07:00:51    46.75   13681

08/02/2008  07:00:57    46.75   14022

09/02/2008  07:01:00    46.75   10270

09/08/2008  07:01:11    46.75   14850

09/02/2008  07:01:22    46.75   20568

08/02/2008  07:01:24    46.75   15683

09/02/2008  07:02:16    46.65   11698

1 个答案:

答案 0 :(得分:3)

operator.itemgetter(a, b, c)相当于lambda x: x[a][b][c],而不是lambda x: (x[a], x[b], x[c])

你真正想要的是:

sorted(df, key=lambda x: (x[1], x[3]))

另请注意,我将索引2和4更改为1和3; Python索引从0开始。

由于您似乎使用的是pandas数据框,而不是列表(下次请在您的问题中提及),以下是按字母排序DataFrame的方式:

df.sort_values(['time', 'number'])

使用列或列列表调用df.sort_values进行排序。不要把它分配给任何东西; df.sort_values就地工作。