pandas 从sql中选择行(如果它们也在 Dataframe 中)

dhxwm5r4  于 2023-02-07  发布在  其他
关注(0)|答案(1)|浏览(100)

我有一个包含大量行的MS SQL服务器(大约400万),我还可以在给定的时间范围内得到我的网站所有访问者的电话号码列表,我可以将其转换为csv文件,然后转换为python中的 Dataframe 。我想做的是从我的服务器中选择两列(一个是电话号码,另一个是那个人的属性)但是我只想从同时存在于我的数据框和服务器中的人中选择这个记录。我目前所做的是从sql server中选择所有客户,然后将它们与我的数据框合并。但显然这不是很快,有没有办法做得更快?

query2 = """
SELECT encrypt_phone, col2
FROM DatabaseTable
    """
cursor.execute(query2)
tables = cursor.fetchall()
df2 = pd.DataFrame.from_records(tables, columns=[x[0] for x in cursor.description])
df1.merge(df2, how='inner', indicator=True)
jv4diomz

jv4diomz1#

如果您的 DataFrame 没有太多行,我会用here这样简单的方法:

V = df["colx"].unique()

Q = 'SELECT encrypt_phone, col2 FROM DatabaseTable WHERE coly IN ({})'.format(','.join(['?']*len(V)))

cursor.execute(Q, tuple(V))
tables = cursor.fetchall()

df2 = pd.DataFrame.from_records(tables, columns=[x[0] for x in cursor.description])

注意:colxcoly分别是panda DataFrame和SQL表中引用客户(id或name,..)的列。
否则,您可能需要将df1存储为DB中的表,然后执行sub-query

df1.to_sql('DataFrameTable', conn, index=False) #this will store df1 in the DB

Q = "SELECT encrypt_phone, col2 FROM DatabaseTable WHERE coly IN (SELECT colx FROM DataFrameTable)"

df2 = pd.read_sql_query(Q, conn)

相关问题