Python中datatable链式调用filter、groupby、sum无法得到正确结果
问题原因与解决方法
- 第一个问题:过滤条件逻辑与R dplyr规则不完全对齐,存在优先级隐患。R代码的过滤规则是「Num为12或17 且 字母为D」,而Python中
&的运算优先级高于|,你的原写法会被解析为「Num为17,或者(Num为12且字母为D)」,如果存在Num=17但Letter不为D的行,两种写法的结果会不一致。要和R逻辑完全匹配需要调整括号位置:(f.Num == 17 | f.Num == 12) & (f.Letter == 'D') - 第二个问题:误用了
update方法。update的作用是给原数据集新增列、保留所有原始行,和dplyr的summarise功能完全不同。要实现分组汇总、每个分组仅返回一行结果的需求,直接在j参数位置定义聚合表达式即可。
正确实现代码
res = df[((f.Num == 17) | (f.Num == 12)) & (f.Letter == 'D'), : ][:, {'Total': sum(f.Count)}, by(f.ID)]
运行后输出结果为:
ID Total 0 1 3 1 2 4
补充说明
仅当你需要保留所有原始行、同时给同组所有行新增汇总值的场景下才需要使用update,分组输出汇总结果的场景不需要调用该方法。
内容的提问来源于stack exchange,提问作者ViSa
相关产品推荐
相关产品推荐

