Присоединиться на основе нескольких сложных условий в Python - PullRequest
1 голос
/ 14 апреля 2019

Мне интересно, есть ли способ в Python (внутри или за пределами Pandas) сделать эквивалентное объединение, как мы можем сделать в SQL для двух таблиц, основанных на нескольких сложных условиях, таких как значение в таблице 1 более чем на 10 меньше, чемв таблице 2 или только для некоторого поля в таблице 1, удовлетворяющего некоторым условиям и т. д.

Это для объединения некоторых фундаментальных таблиц для получения объединенной таблицы с большим количеством полей и информации.Я знаю, что в Pandas мы можем объединить два кадра данных для некоторых имен столбцов, но такой механизм кажется слишком простым, чтобы дать желаемые результаты.

Например, эквивалентный код SQL может выглядеть следующим образом:

SELECT
a.*,
b.*
FROM Table1 AS a
JOIN Table 2 AS b
ON
a.id = b.id AND
a.sales - b.sales > 10 AND
a.country IN ('US', 'MX', 'GB', 'CA')

Я хотел бы получить эквивалентный способ получения одинаковой объединенной таблицы в Python для двух фреймов данных.Кто-нибудь может поделиться идеями?

Спасибо!

1 Ответ

1 голос
/ 14 апреля 2019

В принципе ваш запрос может быть переписан как join и предложение фильтра where.

SELECT a.*, b.*
FROM Table1 AS a
JOIN Table2 AS b
ON a.id = b.id 
WHERE a.sales - b.sales > 10 AND a.country IN ('US', 'MX', 'GB', 'CA')

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

import pandas as pd

df_a, df_b = pd.Dataframe(...), pd.Dataframe(...)

# since A.country has nothing to do with the join, we can filter it first.
df_a = df_a[df_a["country"].isin(['US', 'MX', 'GB', 'CA'])]

# join 
merged = pd.merge(df_a, df_b, on='id', how='inner')

# filter
merged = merged[merged["sales_x"] - merged["sales_y"] > 10]

не по теме: в зависимости от варианта использования вы можете использовать abs() разницу.

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