【问题标题】:select only those columns from table have not null values in q kdb仅从表中选择那些列在 q kdb 中没有空值
【发布时间】:2019-08-09 10:56:59
【问题描述】:

我有一张桌子:

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

但没用。

【问题讨论】:

    标签: kdb


    【解决方案1】:

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

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

    [all null t] 给出一个检查列值是否全部为空的字典。

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

    Where 返回为真的字典的键

    q)where[all null t]
    ,`b
    

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

    希望这会有所帮助

    【讨论】:

      【解决方案2】:

      处理字符串列(或任何嵌套列)的 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
      

      【讨论】:

        【解决方案3】:

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

        要使 QSQL 查询产生您想要的行为,您需要首先检查所有列并确定哪些列 all 为空,然后将其输入到函数语句中。这将是非常低效的。

        鉴于您需要全面检查所有列数据(以检查所有值是否为空),以下将实现这一点

        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 错误)

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-04-18
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多