【问题标题】:Replicating results from pd.merge in SQL?在 SQL 中从 pd.merge 复制结果?
【发布时间】:2020-05-26 01:30:03
【问题描述】:

我一直在使用 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 a 上的表 A 和表 B 和表 C 执行 pd.merge,并在 ID a2 上使用第一次合并的结果表。在使用 pd.merge 时,我注意到它会在重复的 ID 中添加 _x_y(我的意思是在表 A 和表 B 的第一个 pd.merge 中,表 A 中的 c将变为 c_x,而表 B 中的 c 将变为 c_y,对于任何其他重复 ID,依此类推。对于任何连接,这同样适用于任何其他重复 ID。

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

【问题讨论】:

  • 您能否发布一些代码来显示您现在如何合并数据以及您希望结果如何?不清楚您希望如何处理重复的行和列。

标签: python sql pandas join select


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

    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)
    

    希望你觉得它有用。

    【讨论】:

      猜你喜欢
      • 2018-09-17
      • 2020-07-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-11-03
      • 2015-07-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多