2

我创建了一个数据表框架,

DT_EX = dt.Frame({'sales':[103.07, 47.28, 162.15, 84.47, 44.97, 46.97, 34.99, 9.99, 29.99, 64.98],
                  'quantity':[6, 2, 8, 3, 3, 3, 1, 1, 1, 2],
                  'customer_lifecycle_status':['Lead','First time buyer','Active customer','Defecting customer','
                                             'Lead','First time buyer','Lead','Lead','Lead','Lead']})

现在我试图从数据表中只选择 2 个字段,

DT_EX[:, f.sales, f.quantity]

在这种情况下,它显示从数量到销售额的数据,而它应该以指定的顺序(销售额,数量)显示它们。从这个输出中得到的另一个观察结果是,数量字段按升序排序。

保留这种情况,现在我尝试将括号中的必填字段传递为

DT_EX[:, (f.sales,f.quantity)]

这里它现在产生正确的输出,没有任何排序/混乱的字段

始终建议在括号中传递要选择的字段。

最后,我很想知道第一种情况发生了什么?,你能解释清楚吗?

4

1 回答 1

2

数据表的主要语法是

                            DT[i, j, by, ...]

也就是说,当您在方括号中编写一系列表达式时,第一个被解释为i(行过滤器),第二个被解释为j(列选择器),第三个被解释为by(分组变量)。

通常,您会使用by()函数来表达分组条件,但旧语法允许在第三个位置指定一个裸列名称DT[],并且它被解释为分组变量。这种用法现在被认为已弃用,最终可能会被删除,但至少目前是这样。

因此,当您编写 时DT_EX[:, f.sales, f.quantity],该quantity列被解释为按条件分组(并且由于j没有任何归约操作,因此它本质上是一种排序)。使用分组变量的另一个效果是它被移到结果框架的前面,这实际上意味着您将看到列(数量、销售额)的排列顺序与它们的“相反”顺序。

但是,如果您只需要从框架中选择 2 列,那么您需要确保这 2 列都jDT[...]. 这可以通过列表、元组或字典来完成:

DT_EX[:, [f.sales, f.quantity]]
DT_EX[:, (f.sales, f.quantity)]
DT_EX[:, {"SALES": f.sales, "QUANT": f.quantity}]
于 2020-05-18T16:43:49.893 回答