python - 使用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
解决方案
从datatable
0.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 行执行一些操作。
推荐阅读
- amazon-web-services - AWS EC2 不解析 DNS 主机名
- android - 二维码扫描仪获取数据,无法连接mysql
- ios - 无法更新 FBSDKCoreKit POD iOS
- ef-core-2.1 - 尽管急切地获取“尝试延迟加载分离实体上的导航属性”
- javascript - 如何设置 vue-carousel-3d 的方向
- rabbitmq - 在 travis 构建设置中声明 rabbitmq 交换
- google-app-engine - 在调试模式下本地运行 Google App Engine
- swift - 如何让 ClockKit 生成超过 100 个时间线条目?
- java - 在集成测试中进行模拟是否被认为是一种好习惯?
- ssl - 使用 KubernetesDotNet 访问 Kubernetes / Kubernetes API