仅选择表中的那些列在q kdb中不具有空值

时间:2019-08-09 10:56:59

标签: kdb

我有一张桌子:

q)t:([] a:1 2 3; b:```; c:`a`b`c)
a b c
-----
1   a
2   b
3   c

我要从此表中仅选择不具有空值的列,在这种情况下,输出中应省略列b。(类似于pandas中的dropna方法)。

expected output
a c
---
1 a
2 b
3 c

我尝试了很多类似

select from t where not null cols

但没有用。

3 个答案:

答案 0 :(得分:6)

这是一个简单的解决方案,可以满足您的需求:

q)where[all null t]_t
a c
---
1 a
2 b
3 c

[all null t]提供了一个字典,用于检查列值是否全部为null。

q)all null t
a| 0
b| 1
c| 0

在哪里返回字典中的键,这是真的

q)where[all null t]
,`b

最后,您使用_从表t中删除列

希望这会有所帮助

答案 1 :(得分:1)

kdb的本质是基于列的,这意味着where子句在给定列的行上起作用。

要使QSQL查询产生所需的行为,您需要首先检查所有列,确定哪些列为 all null,然后将其输入功能性语句。这将是非常低效的。

鉴于您需要全面检查所有列数据,而不管(以检查所有值是否为空),以下将实现此目的

q)@[flip;;enlist] k!d k:key[d] where not all each null each value d:flip t
a c
---
1 a
2 b
3 c

在这里,我将表格转换成字典,并提取其值以确定是否有任何列仅包含空值(all each null each)。然后,我通过where语句将该布尔值列表应用于字典的键(即列名)。然后,我们可以使用这些键将索引重新索引到原始字典中,并创建非空列的子集字典,然后将其转换回表中。

我已经按习惯将最终的转换归纳为带有错误捕获的表,以确保即使只有一行有效(防止出现'rank错误),字典也可以转换为表< / p>

答案 2 :(得分:1)

对Sander解决方案的修改,它可以处理字符串列(或任何嵌套列):

q)t:([] a:1 2 3; b:```; c:`a`b`c;d:"   ";e:("";"";"");f:(();();());g:(1 1;2 2;3 3))

q)t
a b c d e  f g
----------------
1   a   ""   1 1
2   b   ""   2 2
3   c   ""   3 3

q)where[{$[type x;all null x;all 0=count each x]}each flip t]_t
a c g
-------
1 a 1 1
2 b 2 2
3 c 3 3