Pandas function pandas .read_sql_table () возвращает DataFrame со значениями в неправильном порядке - PullRequest
0 голосов
/ 05 мая 2020

Я пытаюсь получить DataFrame из таблицы PostgreSQL, используя следующий код:

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 будет go например, от 50 до 73, затем от 1 до 49, от 73 до 100. Я попытался добавить значение chunk_size, чтобы посмотреть, имеет ли это значение, и получил тот же результат.

Ответы [ 2 ]

2 голосов
/ 05 мая 2020

Базы данных AFAIK не всегда возвращают значения по первичному ключу. Вы можете сортировать по pandas:

table.sort_values(by=['id'])
0 голосов
/ 05 мая 2020

Логически SQL таблицы не имеют порядка, и то же самое относится к запросам, если явно не определено с помощью ORDER BY. Некоторые СУБД, но не PostgreSQL 1 , могут использовать кластерный индекс и хранить строки физически по порядку, но это не гарантирует, что SELECT возвращает строки в этом порядке без использования ORDER BY. Например, планы параллельного выполнения отбрасывают все ожидания относительно результатов запроса, соответствующих физическому порядку в корзине. Обратите внимание, что СУБД может использовать, например, индексы или другую информацию для получения строк по порядку без необходимости сортировки, поэтому упорядочение по первичному ключу не должно увеличивать накладные расходы.

Либо отсортируйте данные в Python как показано в другом ответе, или используйте вместо него read_sql_query() и передайте запрос в указанном порядке:

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

1 : PostgreSQL имеет CLUSTER команда, которая кластеризует таблицу на основе индекса, но это одноразовая операция.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...