Python 如何筛选pydatatable中列组的NA值?
我已经创建了一个包含3组不同观测值的数据表,如下所示: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],
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!我正要问你这是否是预期的行为。我会对这个问题竖起大拇指的。