首页 > 解决方案 > 使用python数据表按组排列前N行

问题描述

在python数据表中按组查询前 N 行的正确方法是什么?
例如,要按组获取具有最大值v3的前 2 行,id2, id4我将按以下方式执行 pandas 表达式:

df.sort_values('v3', ascending=False).groupby(['id2','id4']).head(2)

在 R 中使用data.table

DT[order(-v3), head(v3, 2L), by=.(id2, id4)]

或在 R 中使用dplyr

DF %>% arrange(desc(v3)) %>% group_by(id2, id4) %>% filter(row_number() <= 2L)

使用 pandas 的示例数据和预期输出:

import datatable as dt
dt = dt.Frame(id2=[1, 2, 1, 2, 1, 2], id4=[1, 1, 1, 1, 1, 1], v3=[1, 3, 2, 3, 3, 3])
df = dt.to_pandas()
df.sort_values('v3', ascending=False).groupby(['id2','id4']).head(2)
#   id2  id4  v3
#1    2    1   3
#3    2    1   3
#4    1    1   3
#2    1    1   2

标签: pythonrpy-datatable

解决方案


datatable0.8.0 版本开始,这可以通过组合分组、排序和过滤来实现:

from datatable import *
DT = Frame(id2=[1, 2, 1, 2, 1, 2], 
           id4=[1, 1, 1, 1, 1, 1], 
           v3=[1, 3, 2, 3, 3, 3])

DT[:2, :, by(f.id2, f.id4), sort(-f.v3)]

产生

     id2  id4  v3
---  ---  ---  --
 0     1    1   3
 1     1    1   2
 2     2    1   3
 3     2    1   3

[4 rows x 3 columns]

解释:

  • by(f.id2, f.id4)按列“id2”和“id4”对数据进行分组;
  • sort(-f.v3)命令告诉datatable按“v3”列以降序对记录进行排序。在存在by()此运算符的情况下,将在每个组内应用;
  • 第一个:2选择前 2 行,同样在每个组内;
  • 第二个:选择所有列。如果需要,这可能是列或表达式的列表,允许您对每个组的前 2 行执行一些操作。

推荐阅读