在sql中复制pd.merge的结果?

brvekthn  于 2021-07-26  发布在  Java
关注(0)|答案(2)|浏览(369)

我一直在用python本地处理一些数据集,现在正试图用sql在云环境中复制相同的结果。
我有3个表,每个表都有多个重复的id。例如,表a将包含id a, b, c, d, ... ,表b将包含ID a, c, e, a1, a2 ... ,表c将包含ID d, f, a2, b1, b2, ... 我现在正在做 pd.merge 对于id上的表a和表b a ,和表c,以及id上第一次合并的结果表 a2 . 在使用pd.merge时,我注意到它会添加一个 _x 或者 _y 重复的ID(我的意思是在第一个 pd.merge 在表a和表b中, c 从表a变成 c_x ,和 c 从表b变成 c_y 对于任何其他重复的ID,依此类推。这同样适用于任何连接的任何其他重复ID。
我怎样才能复制这个过程并绕过sql中重复id的问题?

mzsu5hc0

mzsu5hc01#

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

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
jmp7cifd

jmp7cifd2#

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

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)

希望你觉得有用。

相关问题