我创建了一个包含 3 组不同观察值的数据表,
DT_EX= dt.Frame({
'country':['a','a','a','a','b','b','c','c'],
'id':[3,3,3,3,4,4,4,4],
'shop':['dmart','dmart','dmart','dmart','amzn','amzn','amzn','amzn'],
'beef':[23,None,None,None,93,None,None,None],
'eggs':[None,33,None,None,None,103,None,None],
'fork':[None,None,10,None,None,None,210,None],
'veg':[None,None,None,40,None,None,None,340]
})
它的输出为,
| country id shop beef eggs fork veg
-- + ------- -- ----- ---- ---- ---- ---
0 | a 3 dmart 23 NA NA NA
1 | a 3 dmart NA 33 NA NA
2 | a 3 dmart NA NA 10 NA
3 | a 3 dmart NA NA NA 40
4 | b 4 amzn 93 NA NA NA
5 | b 4 amzn NA 103 NA NA
6 | c 4 amzn NA NA 210 NA
7 | c 4 amzn NA NA NA 340
[8 rows x 7 columns]
现在我在数据表的前 3 个字段上应用了推荐的分组,其他剩余列(牛肉、鸡蛋、叉子、蔬菜)的聚合(总和)为
In [5]: DT_EX[:,first(f[:3]).extend(sum(f[3:])),by(f[:3])]
它的输出为-
Out[5]:
| country id shop country.0 id.0 shop.0 beef eggs fork veg
-- + ------- -- ----- --------- ---- ------ ---- ---- ---- ---
0 | a 3 dmart a 3 dmart 23 33 10 40
1 | b 4 amzn b 4 amzn 93 103 0 0
2 | c 4 amzn c 4 amzn 0 0 210 340
[3 rows x 10 columns]
这里它给出了一个正确的输出,但是它添加了重复的列,另一个观察是它用 0 填充 NA 值,它可以在 C 观察中找到。
在这里我做了一些解决方法
In [7]: DT_EX[:,first(f[:3]).extend(sum(f[3:])),by(f[:3])][:,f[:].remove(f[3:6])]
及其输出为,
Out[7]:
| country id shop beef eggs fork veg
-- + ------- -- ----- ---- ---- ---- ---
0 | a 3 dmart 23 33 10 40
1 | b 4 amzn 93 103 0 0
2 | c 4 amzn 0 0 210 340
但我认为这不是一个可行的解决方案,因为我总是必须指定要隐藏在 .remove 函数中的列,
您对此有任何其他想法/建议吗?