Если мы переименуем 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'])
Я надеюсь, что это отвечает на ваш вопрос