Воспроизведение результатов из pd.merge в SQL? - PullRequest
3 голосов
/ 26 мая 2020

Я экспериментировал с некоторыми наборами данных локально в Python, и теперь я пытаюсь воспроизвести те же результаты в облачной среде с SQL.

У меня есть 3 таблицы, каждая с несколькими повторяющимися идентификаторами. Например, таблица A будет содержать идентификаторы a, b, c, d, ..., таблица B будет содержать идентификаторы a, c, e, a1, a2 ..., а таблица C будет содержать идентификаторы d, f, a2, b1, b2, ...

Я сейчас делаю pd.merge для таблицы A и таблицы B с идентификатором a и таблица C с таблицей, полученной в результате первого слияния с идентификатором a2. При использовании pd.merge я заметил, что он добавит _x или _y к повторяющимся идентификаторам (под этим я подразумеваю в первом pd.merge таблицы A и таблицы B, c из таблицы A станет c_x, а c из таблицы B станет c_y и так далее для любых других повторяющихся идентификаторов. То же самое будет применяться к любым другим повторяющимся идентификаторам для любых объединений.

Как бы я был возможность воспроизвести этот процесс и обойти проблему с повторяющимися идентификаторами в SQL?

Ответы [ 2 ]

4 голосов
/ 14 июня 2020

Вы можете использовать несколько соединений и псевдонимов. Значение:

import sqlite3
import numpy as np
import pandas as pd

# Data
df1 = pd.DataFrame({'ID': list('abcde'),'Value': [1,2,3,4,4] })
df2 = pd.DataFrame({'ID': ' a b e a1 a2'.split(),'Value': [10,20,30,40,40] })
df3 = pd.DataFrame({'ID': 'd f a b b2'.split(),'Value': [100,200,300,400,400] })

# Merge using pandas
df = df1.merge(df2,on='ID').merge(df3,on='ID')
print('using pd.merge')
print(df)

# Using SQL
con = sqlite3.connect("mydb.db")
df1.to_sql("df1", con, if_exists='replace',index=False)
df2.to_sql("df2", con, if_exists='replace',index=False)
df3.to_sql("df3", con, if_exists='replace',index=False)

# sql query
q = """
select df1.Value as Value_df1, df2.Value as Value_df2, df3.Value as Value_df3
from df1
join df2
on df1.ID = df2.ID
join df3
on df1.ID = df3.ID
"""
out = pd.read_sql_query(q,con)
print()
print('-'*50)
print('using sql')
print(out)
con.close()

выходы

using pd.merge
  ID  Value_x  Value_y  Value
0  a        1       10    300
1  b        2       20    400

--------------------------------------------------
using sql
   Value_df1  Value_df2  Value_df3
0          1         10        300
1          2         20        400
0 голосов
/ 10 июня 2020

Думаю, вы можете переименовать в объединении остальные объединенные столбцы с новыми именами:

SELECT table_A.ID_a, table_A.c_ID as c_ID_from_A, table_B.c_ID as c_ID_from_B
FROM table_A
JOIN table_B ON(table_A.ID_a = table_B.ID_a)

Надеюсь, вы сочтете это полезным.

...