【问题标题】:Pandas function pandas.read_sql_table() returns a DataFrame with the values in the wrong orderPandas 函数 pandas.read_sql_table() 返回一个 DataFrame,其中的值顺序错误
【发布时间】:2020-08-19 11:40:24
【问题描述】:

我正在尝试使用以下代码从 PostgreSQL 表中获取 DataFrame:

import pandas
from sqlalchemy.engine import create_engine

engine = create_engine("postgresql+psycopg2://user:password@server/database")
table = pandas.read_sql_table(con=engine, table_name= "table_name", schema= "schema")

假设数据库表的主键从 1 变为 100,Data Frames 第一列将变为 50 到 73,然后 1 到 49,73 到 100。我尝试添加一个 chunk_size 值来查看是否不同,得到相同的结果。

【问题讨论】:

    标签: python pandas postgresql sqlalchemy


    【解决方案1】:

    AFAIK 数据库并不总是按主键顺序返回值。你可以在 pandas 中排序:

    table.sort_values(by=['id'])
    

    【讨论】:

      【解决方案2】:

      从逻辑上讲,SQL 表没有顺序,这同样适用于查询,除非使用 ORDER BY 明确定义。一些 DBMS,但不是 PostgreSQL1,可能会使用聚集索引并按物理顺序存储行,但这并不能保证 SELECT 在不使用 ORDER BY 的情况下按该顺序返回行。例如,并行执行计划会抛出所有与 bin 中的物理顺序匹配的查询结果的期望。请注意,DBMS 可以使用例如索引或其他信息来按顺序获取行而无需排序,因此按主键排序不应增加太多开销。

      要么按照其他答案所示在 Python 中对数据进行排序,要么改用 read_sql_query() 并以指定的顺序传递查询:

      table = pandas.read_sql_query(
          "SELECT * FROM schema.table_name ORDER BY some_column",
          con=engine)
      

      1:PostgreSQL 有一个CLUSTER 命令根据索引对表进行聚类,但它是一次性操作。

      【讨论】:

        猜你喜欢
        • 2021-03-16
        • 2020-04-16
        • 1970-01-01
        • 2018-01-01
        • 2018-10-05
        • 2016-12-09
        • 2018-02-23
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多