Pydatatable 枚举每个组内的行
Pydatatable enumerate rows within each group
给定以下数据表
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
根据 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 当前所有可用函数的综合资源?
这是一个 hack,及时应该有一个内置的方法来进行累积计数,甚至可以利用 itertools
或 python 中的其他高性能工具,同时仍然非常快:
第 1 步:获取列 A
和 B
的计数并导出到列表
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
给定以下数据表
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
根据
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 当前所有可用函数的综合资源?
这是一个 hack,及时应该有一个内置的方法来进行累积计数,甚至可以利用 itertools
或 python 中的其他高性能工具,同时仍然非常快:
第 1 步:获取列 A
和 B
的计数并导出到列表
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