Sqlalchemy объединяет таблицу запросов, чтобы получить имена столбцов, выровненные как многоуровневые столбцы - PullRequest
0 голосов
/ 04 июля 2019

Прежде всего, я понимаю, что я хочу достичь, используя pandas dataframe.concat (). Однако из-за большого объема данных память компьютера иногда падает. Поэтому я пытаюсь добиться объединения нескольких таблиц, сохраняя эти таблицы в БД через sqlalchemy. Я объясню, какова моя цель, приведя простой пример ниже.

таблица: Case0

enter image description here

таблица: Case1

enter image description here

что я хочу достичь, это что-то вроде этого с помощью запроса Python sqlalchemy ( NOT pandas): enter image description here

import pandas as pd 

lst1 = ['Apple', 'Banana'] 
lst2 = ['Pink', 'Yellow'] 
lst3 = [1.1,1.8]  
lst4 = [1.0,1.2] 
case0 = pd.DataFrame(list(zip(lst1, lst2,lst3,lst4)), 
               columns =['Fruit', 'Color','shot1','shot2']) 

lst5 = ['Apple', 'Orange'] 
lst6 = ['Pink', 'Orange'] 
lst7 = [1.1,1.5]  
lst8 = [1.0,1.3] 
case1 = pd.DataFrame(list(zip(lst5, lst6,lst7,lst8)), 
               columns =['Fruit', 'Color','shot1','shot2']) 

Имеет ли sqlalchemy возможность включать связывающее имя таблицы в каждый столбец в виде кортежа, который впоследствии можно легко перенести в многоуровневые столбцы в пандах?

1 Ответ

0 голосов
/ 06 июля 2019

Если мы переименуем Case0 в First и Case1 во Second - я не уверен, что SQL может обрабатывать числа в именах таблиц, похоже, он требует следующий SQL:

-- use coalesce to fill out the column if it is not present in first
SELECT coalesce(first.fruit, second.fruit) as fruit,
       coalesce(first.color, second.color) as color,
       first.shot1 as case1_shot1,
       first.shot2 as case1_shot2,
       second.shot1 as case2_shot1,
       second.shot2 as case2_shot2
FROM first
FULL OUTER JOIN second
  ON first.fruit = second.fruit
  AND first.color = second.color

И вы можете построить это, используя SQLAlchemy:

session.query(
    func.coalesce(First.fruit, Second.fruit),
    func.coalesce(First.color, Second.color),
    First.shot1,
    First.shot2,
    Second.shot1,
    Second.shot2
).select_from(First).outerjoin(
    Second,
    (First.fruit == Second.fruit) & (First.color == Second.color),
    full=True
)

Поскольку SQLAlchemy возвращает наборы результатов в виде кортежей, не имеет значения, назовете ли вы их или нет, но поскольку вы явно устанавливаете порядок, вы можете просто назвать их при загрузке в DataFrame.

df = pd.DataFrame(query.all(), columns=['Fruit', 'Color', 'case1shot1', 'case1shot2', 'case2shot1', 'case2shot2'])

Я надеюсь, что это отвечает на ваш вопрос

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