我一直在使用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绕过该问题?
答案 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)
希望您发现它有用。