Использование Pandas Dataframe в соединении SQL - PullRequest
0 голосов
/ 11 января 2019

Я пытаюсь выполнить соединение SQL для содержимого фрейма данных с внешней таблицей в базе данных Postgres.

Вот как выглядит Dataframe:

>>> df
   name  author  count
0  a     b       10
1  c     d       5
2  e     f       2

Мне нужно объединить его с таблицей Postgres, которая выглядит следующим образом:

TABLE: blog
title   author    url    
a       b         w.com
b       b         x.com
e       g         y.com

Это то, что я пытаюсь сделать, но это не правильный синтаксис для запроса:

>>> sql_join = r"""select b.*, frame.*  from ({0}) frame
        join blog b
        on frame.name = b.title
        where frame.owner = b.owner 
        order by frame.count desc
        limit 30;""".format(df)

>>> res = pd.read_sql(sql_join, connection)

Я не уверен, как я могу использовать значения в фреймах данных в запросе sql. Может ли кто-нибудь указать мне правильное направление? Спасибо!

Редактировать : В соответствии с моим вариантом использования я не могу преобразовать таблицу блога в кадр данных с учетом ограничений памяти и производительности.

Ответы [ 2 ]

0 голосов
/ 14 января 2019

Мне удалось сделать это без необходимости преобразовывать фрейм данных во временную таблицу или без чтения SQL в фрейм данных из таблицы блога.

Для тех, кто сталкивается с той же проблемой, это достигается с помощью виртуальной таблицы типов.

Вот так выглядит мой последний sql-запрос:

>>> inner_string = "VALUES ('a','b',10), ('c','d',5), ('e','f',2)"

>>> sql_join = r"""SELECT * FROM blog
        JOIN ({0}) AS frame(title, owner, count)
        ON blog.title = frame.title
        WHERE blog.owner = frame.owner 
        ORDER BY frame.count DESC
        LIMIT 30;""".format(inner_string)

>>> res = pd.read_sql(sql_join, connection)

Вы можете использовать манипуляции со строками, чтобы преобразовать все строки в кадре данных в одну большую строку, аналогичную inner_string.

0 голосов
/ 11 января 2019

Вы должны создать другой фрейм данных из таблицы Postgres, а затем объединить оба фрейма данных.

Вы можете использовать read_sql для создания df из таблицы:

import psycopg2  ## Python connector library to Postgres
import pandas as pd

conn = psycopg2.connect(...) ## Put your DB credentials here
blog_df = pd.read_sql('blog', con=conn)
## This will bring `blog` table's data into blog_df

Это должно выглядеть так:

In [258]: blog_df
Out[258]: 
  title author    url
0     a      b  w.com
1     b      b  x.com
2     e      g  y.com

Теперь вы можете присоединиться к df и blog_df, используя merge, как показано ниже:

In [261]: pd.merge(df, blog_df, left_on='name', right_on='title')
Out[261]: 
  name author_x  count title author_y    url
0    a        b     10     a        b  w.com
1    e        f      2     e        g  y.com

Вы получите результат, как указано выше. Вы можете очистить его дальше.

Дайте мне знать, если это поможет.

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