Pydatatable 枚举每组中的行

Posted

技术标签:

【中文标题】Pydatatable 枚举每组中的行【英文标题】:Pydatatable enumerate rows within each group 【发布时间】:2020-10-06 03:21:15 【问题描述】:

给定以下数据表

DT = dt.Frame('A':['A','A','A','B','B','B'],
               'B':['a','a','b','a','a','a'],
               )

我想创建列“C”,它对列 A 和 B 中每个组内的行进行编号,如下所示:

     A   B   C
 0   A   a   1
 1   A   a   2
 2   A   b   1
 3   B   a   1
 4   B   a   2
 5   B   a   3

根据this thread 对于 pandas cumcount() 或 rank() 将是选项,但它似乎没有为 pydatatable 定义:

DT = DT[:, f[:].extend('C': cumcount()),by(f.A,f.B)]
DT = DT[:, f[:].extend('C': rank(f.B)),by(f.A,f.B)]

a) 如何对组内的行进行编号?

b) 是否有包含 pydatatable 所有当前可用功能的综合资源?

【问题讨论】:

pydatatable docs 【参考方案1】:

这是一个 hack,及时应该有一种内置的方法来进行累积计数,甚至可以利用 itertools 或 python 中的其他高性能工具,同时仍然非常快:

第 1 步:获取列数 AB 并导出到列表

result = DT[:, dt.count(), by("A","B")][:,'count'].to_list()

第 2 步:使用itertools chain 和list comprehension 的组合来获取累积计数:

from itertools import chain

cumcount = chain.from_iterable([i+1 for i in range(n)] for n in result[0])

第 3 步:将结果分配回DT

DT['C'] = dt.Frame(tuple(cumcount))

print(DT)


    A       B   C
   ▪▪▪▪   ▪▪▪▪  ▪▪▪▪
0   A      a    1
1   A      a    2
2   A      b    1
3   B      a    1
4   B      a    2
5   B      a    3
6 rows × 3 columns

【讨论】:

以上是关于Pydatatable 枚举每组中的行的主要内容,如果未能解决你的问题,请参考以下文章

从每组中的 3 个表中选择 sql 中具有最新日期的行

Python Datatable/Pydatatable:如何通过正则表达式过滤数据表中的行并根据过滤器为新变量赋值

Python:删除每组中具有最大值的行

跳过每组中的前 n 行

选择每组中的最后一条记录

识别和计算法术(每组中的独特事件)