我已经创建了一个datatable框架,
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']})现在,我尝试从datatable中只选择两个字段,
DT_EX[:, f.sales, f.quantity]在这种情况下,它显示从quantity到sales的数据,而应该以指定的顺序(sales,quantity)显示数据。在这里,这个输出的另一个观察是-数量字段按升序排序。
将这种情况保持在一边,现在我已经尝试将所需的字段作为括号传递为
DT_EX[:, (f.sales,f.quantity)]在这里,它现在正在生成正确的输出,而不需要对字段进行任何排序/混乱。
总是建议传递要在括号中选择的字段.
最后,我想知道第一宗个案发生了甚麽事,可否请你解释清楚?
发布于 2020-05-18 16:43:49
datatable的主要语法是
DT[i, j, by, ...]也就是说,在方括号中写入表达式序列时,第一个表达式被解释为i (行筛选器),第二个表达式解释为j (列选择器),第三个表达式解释为by (组-by变量)。
通常,您将使用一个by()函数来表示一个组--按条件,但是旧的语法允许在DT[]的第三个位置指定一个裸列名,并且它被解释为一个group变量。这种使用现在被认为是不可取的,并可能最终被取消,但至少目前是这样的。
因此,在编写DT_EX[:, f.sales, f.quantity]时,根据条件将quantity列解释为一个组(而且由于j没有任何简化操作,因此它本质上是一种排序)。使用分组变量的另一个效果是,它被移动到结果帧的前面,这实际上意味着您将看到列(数量、销售额)按照列的“相反”顺序排列。
但是,如果只需要从一个框架中选择2列,那么就需要确保这2列都在j位置的DT[...]参数列表中。这可以通过列表、元组或字典来完成:
DT_EX[:, [f.sales, f.quantity]]
DT_EX[:, (f.sales, f.quantity)]
DT_EX[:, {"SALES": f.sales, "QUANT": f.quantity}]https://stackoverflow.com/questions/61865860
复制相似问题