pydatatable多列分组去重后为何生成B.0、C.0冗余重复列
冗余列生成的根本原因
这个现象是pydatatable的固定分组输出规则,和你写的查询逻辑叠加产生的,拆解如下:
- 只要在
by参数中指定了分组列,这些列会默认自动作为结果表的前置列输出,完全不受j位置(行筛选条件后的第二个参数位)的返回逻辑影响。 - 你当前的查询逻辑:
by参数传入了全部三列[f[0],f[1],f[2]](对应A、B、C列)做分组键,按照上面的规则,这三列会自动出现在结果前排- j位置写了
first(f[1:]),意思是对原表从索引1开始的B、C两列,按分组计算每组内的首个值,最终会返回两列和B、C内容完全一致的聚合结果
- 当返回的列和分组自动带出的列同名时,pydatatable为了避免列名冲突,会自动给j位置返回的同名列追加
.0后缀做区分,最终就生成了无实际意义的B.0、C.0冗余列。
适配需求的正确实现方式
你的核心需求是基于A、B、C三列的组合对全表做行去重,保留每个唯一组合的第一行,完全可以通过无冗余的写法实现:
- 最简实现:直接调用pydatatable的原生去重接口
DT.unique(),会自动保留所有列值完全一致的唯一行,直接输出符合预期的5行3列结果 - 分组逻辑实现:因为分组键已经会自动带出全部A、B、C列,不需要在j位置重复计算B、C的聚合值,只要用一个占位聚合就行,代码可写为
DT[:, count(), by([f[0],f[1],f[2]])],得到的结果前3列就是你要的去重内容
注意:如果是按部分列分组、保留其他列首值的场景,才需要把分组列单独放到by参数,非分组列的首值计算放到j位置,这种写法不会产生冗余列。比如按A列分组、取B和C的首值,写DT[:, first(f[1:]), by(f[0])],输出就只有A、B、C三列,完全没有冗余。
内容的提问来源于stack exchange,提问作者myamulla_ciencia
相关产品推荐
相关产品推荐

