Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/307.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何筛选pydatatable中列组的NA值?_Python_Py Datatable - Fatal编程技术网

Python 如何筛选pydatatable中列组的NA值?

Python 如何筛选pydatatable中列组的NA值?,python,py-datatable,Python,Py Datatable,我已经创建了一个包含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],

我已经创建了一个包含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]
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
现在,我在datatable的前3个字段上应用了一个建议的分组,即其他列的聚合总和Beef、Oggs、fork、veg as

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])]
其产量为,

   | 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]
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函数

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

您可以使用:

DT_EX[:, dt.sum(f[:].remove(f[:3])), by(f[:3])]
不过还是觉得有点尴尬。我希望只使用dt.sumf[:],并自动删除by中的列。不确定是否有不同的语法

编辑:

正如Pasha在评论中指出的,在这种情况下,使用以下方法更简单:

DT_E[:, dt.sum(f[3:]), by=f([:3])]

我认为这是正确的。希望API能得到更新,现在能正常工作。但是,它应该会改进,因为它只会保持NA的原样,而不是用0填充。不管我现在怎么想。我只是想实现重塑数据表的功能,在这个过程中,我学到了很多pydatatable。。感谢您在这方面的帮助。或者简单地说,dt.sumf[3:]您认为f[:]应该自动删除by-columns是正确的;我在datatable的GitHub上提交了2460期来更正这个问题。谢谢,@Pasha!我正要问你这是否是预期的行为。我会对这个问题竖起大拇指的。