Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/302.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 Postgres获取所有没有空值的列_Python_Pandas_Postgresql - Fatal编程技术网

Python Postgres获取所有没有空值的列

Python Postgres获取所有没有空值的列,python,pandas,postgresql,Python,Pandas,Postgresql,因此,我有一个包含大量列和行的表,我需要对其进行筛选,以便删除具有空值的列 在python中,我可以通过以下小示例来实现: df=pd.DataFrame{'col1':[1,无,3],'col2':[3,4,5],'col3':[3,4,无]} df.dropnaaxis=1,how='any' 但我就是不知道在博士后该怎么做 我找不到那个问题的答案。 我确实找到了一些答案,但他们使用了我无法使用的列名,因为我的列名太多了 谢谢 postgresql中的动态sql 您可以使用“执行语句”。 使

因此,我有一个包含大量列和行的表,我需要对其进行筛选,以便删除具有空值的列

在python中,我可以通过以下小示例来实现:

df=pd.DataFrame{'col1':[1,无,3],'col2':[3,4,5],'col3':[3,4,无]} df.dropnaaxis=1,how='any' 但我就是不知道在博士后该怎么做

我找不到那个问题的答案。 我确实找到了一些答案,但他们使用了我无法使用的列名,因为我的列名太多了

谢谢

postgresql中的动态sql

您可以使用“执行语句”。 使用获取列的名称

SELECT *
   FROM information_schema.columns
  WHERE table_schema = 'your_schema'
    AND table_name = 'your_table'
      ;
对于其中的每一个,如果列有空值,则在视图中声明“delete from”

DECLARE
    column_name text;
BEGIN
    FOR column_name IN SELECT FROM information_schema.columns WHERE table_schema = 'your_schema' AND table_name = 'your_table' LOOP

        ...
        EXECUTE 'delete from ... where(SELECT ....' || column_name || '.....)';
        ...

    END LOOP;
END;

在Postgres中没有这样的功能,因此您必须构建自己的功能。实现此目的的一种方法是检索所有列名,包括:

select attname
  from pg_attribute
 where attrelid = (select oid from pg_class where relname = 'foo')
   and attnum > 0;
然后,循环遍历attnames并执行以下操作:

select count(*)
  from foo
 where <attname> is null;

为了您的安全,我不会添加DROP列命令

我不能说它会打破任何速度记录,但它会满足你的要求。不需要动态SQL或用户定义的函数

选择t* 从您的_表中选择t -如果存在空值,则这些值将不相等 去哪里?jsonbt=jsonb?strip?nullsto?jsonbt 如果性能成为一个真正的问题,比如必须多次运行此查询,那么您可以对此进行调整。但是,如果是这样的话,我建议您规范化数据库的数据模型。你可能只是在掩盖结构缺陷

检测到创建索引空值 在您的表上,to_jsonbyour_表=jsonb_strip_nullsto_jsonbyour表; 进一步的优化可能会在索引中使用

下面是一个实际的例子:

创建空表\u示例 id串行主键, col1 int, col2文本, col3布尔型 ; 插入null_示例col1、col2、col3值 1,“test1”,对, NULL,'test2',false, 3,NULL,true, 4,'test4',NULL, 5,‘test5’,假; 现在,如果您运行以下命令

选择t* 从null_示例中选择t 其中to_jsonbt=jsonb_strip_nullsto_jsonbt; …您将获得以下输出。任何包含空列值的行都已被忽略

id | col1 | col2  | col3
---+------+-------+------
1  | 1    | test1 | t
5  | 5    | test5 | f
如果您试图将列作为删除的目标,例如从ALTERTABLE…DROP COLUMN语句中删除列,那么下面的查询也可以帮助您

选择results.key、count*、array\u aggt.id作为受影响的\u id 从null_示例中选择t 交叉连接横向jsonb_eachto_jsonbt作为结果键,值 其中results.value='null'::jsonb 按结果分组。关键字 这将返回:

 key | count | affected_ids
-----+-------+--------------
col2 | 1     | {3}
col3 | 1     | {4}
col1 | 1     | {2}

这有用吗?谢谢@richyen,但这对我的情况没有帮助。值得一试:D-你能解释一下为什么它对你不起作用吗?我猜你想要一个真正删除列的查询?如果是这样的话,我认为没有任何DDL可以做到这一点。你必须编写itUmm脚本。它不起作用的原因是我得到了表,因为我可以从我的表中选择*,给了我相同的结果@richyenAh,我看到了,该链接给出了所有带null的行,你想要所有带null的列。我相信Postgres没有任何类似于AFAIK的功能,除非您编写一个plpgsql函数来完成它。这如何指示哪一列为空?这向我展示了table_catelog、table_schema和更多的列,这些您不熟悉的列可以阅读,例如,您必须知道如何在PostgreSqlThank中编程函数。所以为了得到我想要的结果,我必须创建一个函数?动态SQL非常强大,但也绕过了很多安全性。使用时要格外小心,尤其是当它是由用户提供的参数驱动时。看起来很有趣。您能演示输出吗?在我这边试过了,但没有给我我想要的结果expected@richyen添加示例啊,我现在明白了我误解了这个问题。好吧,让我们检查一下OP-I在问题上添加了一条注释我在PostgreSQL中为我的公司实现了一个时态表系统,即系统版本表。因为每个表都是不同的,而且期望人们为每个表编写定制的时态逻辑和函数将是维护的噩梦,所以我想出了如何将行数据转换成JSON和从JSON转换成JSON。这就为这个问题提供了一个更通用的解决方案。我做的一个具体优化是将触发器中的新旧内容转换为jsonb,以检测是否进行了更改;最有效的更新是您不必进行的更新。表面上与此相似。
 key | count | affected_ids
-----+-------+--------------
col2 | 1     | {3}
col3 | 1     | {4}
col1 | 1     | {2}