Как извлечь один столбец данных из базы данных, ограниченной другой - PullRequest
0 голосов
/ 09 января 2019

Это сделано в Python 2, и я использую Pandas. Хотя я бы очень хотел сделать это в SQL, что, вероятно, делает мою жизнь намного проще, это не вариант.

У меня есть два кадра данных, x и y. В кадре данных x есть столбец BuyerNames, а в y - Buyers, и оба содержат столбец Section среди других общих столбцов. Записи в 'x (BuyerNames)' и 'y (Buyers) имеют одинаковый набор, и данные в общих столбцах обычно согласованы. Я хочу создать фрейм данных, представляющий собой подмножество y, назовите его y *, чтобы для строк с соответствующими индексами значение BuyerNames было равно значению Buyers. Этот фрейм данных имеет ту же длину, и записи, не удовлетворяющие этому условию, содержат запись NaN.

Я создаю третий фрейм данных, z, и в нем есть объединение столбцов x и y. Моя последняя цель - заполнить z записями из раздела, содержащимися в y, сохранив индекс.

Я очень плохо знаком с базами данных, поэтому, вероятно, очень запутанное описание того, что, вероятно, очень просто. Как мне добиться этого эффективным способом? В настоящее время существует решение, которое использует цикл for в Python, который очень медленный и не масштабируется. Я не могу опубликовать код, к сожалению.

1 Ответ

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

Вы правы в том, что эта проблема предназначена для однострочного запроса sqlite:

CREATE TABLE IF NOT EXISTS z AS 
SELECT section, x.buyernames AS buyernames_id, y.buyers AS buyers_id
FROM x JOIN y ON x.buyernames = y.buyers;

... но это, конечно, возможно и в пандах. На мой взгляд, самый простой способ - создать два отдельных фрейма данных, по одному из каждой базы данных. Затем используйте pandas 'concat', чтобы объединить два кадра данных. В документации есть довольно хорошее описание опций.

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

Что касается последнего шага, я не уверен, какой API вы планируете использовать для новой базы данных, поэтому сложно дать вам конкретное руководство по заполнению новой таблицы. У Pandas определенно есть возможность отправить sql , но я не знаю какого-либо способа создать новую таблицу . Лучше всего подойдет sqlalchemy , но у него есть кривая обучения, если вы незнакомы с ORM или базами данных в целом.

РЕДАКТИРОВАТЬ: так как вы не можете предоставить данные, вот вымышленный пример команды соединения. Это должно быть очень быстро, не так быстро, как raw sql, но, конечно, быстрее, чем цикл for. Во-первых, фиктивные данные:

left = pd.DataFrame({'buyernames': ['john', 'frank', 'joe', 'june'],
'section': ['s1', 's2', 's1', 's2'],
'col3': ['C0', 'C1', 'C2', 'C3'],
'col4': ['D0', 'D1', 'D2', 'D3']},
index=[0, 1, 2, 3])

right = pd.DataFrame({'buyers': ['june', 'john', 'frank', 'joe'],
'section': ['s1', 's2', 's1', 's2'],
'col3': ['C4', 'C5', 'C6', 'C7'],
'col4': ['D4', 'D5', 'D6', 'D7']},
index=[4, 5, 6, 7])

и команды панд:

result = pd.merge(left, right, on='section')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...