2

我创建了一个包含 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 函数中的列,

您对此有任何其他想法/建议吗?

4

1 回答 1

4

您可以使用:

DT_EX[:, dt.sum(f[:].remove(f[:3])), by(f[:3])]

不过还是觉得有点别扭。我希望只使用dt.sum(f[:])by自动删除列。不确定是否有不同的语法。

编辑

正如 Pasha 在评论中指出的那样,在这种情况下使用起来更简单:

DT_E[:, dt.sum(f[3:]), by=f([:3])]
于 2020-05-24T05:34:29.060 回答