Pydatatable枚举每个组中的行

2024-06-17 17:24:39 发布

您现在位置:Python中文网/ 问答频道 /正文

给定以下数据表

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,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是否有一个包含所有当前可用功能的综合资源


Tags: by定义选项dtthisthreadframe编号
1条回答
网友
1楼 · 发布于 2024-06-17 17:24:39

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

步骤1:获取列AB的计数并导出到列表

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

步骤2:使用itertools chainlist 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

相关问题 更多 >