从SQL复制pd.merge的结果?

时间:2020-05-26 01:30:03

标签: python sql pandas join select

我一直在使用Python在本地处理一些数据集,现在正在尝试使用SQL在云环境中复制相同的结果。

我有3个表,每个表都有多个重复的ID。例如,表A将包含ID a, b, c, d, ...,表B将包含ID a, c, e, a1, a2 ...,而表C将包含ID d, f, a2, b1, b2, ...

我目前正在对ID pd.merge上的表A和表B以及表C和ID为a的第一次合并得到的表进行a2。在使用pd.merge时,我注意到它将在重复的ID中添加_x_y(也就是说,在表A和表B的第一个pd.merge中,表A的c会变成c_x,表B的c会变成c_y,依此类推,对于其他任何重复的ID,同样适用于任何其他重复的ID进行任何连接。

我如何能够复制此过程,并在SQL中使用重复的ID绕过该问题?

2 个答案:

答案 0 :(得分:4)

您可以使用多个联接和别名值:

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

答案 1 :(得分:0)

我认为您可以在连接的其余列中使用新名称重命名:

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)

希望您发现它有用。

相关问题