Достать по ID в датафрейме данные с SQL, используя запрос
Имеется эксель файл, который преобразую в датафрейм и по строке колонки датафрейма с названием "A6" итерационно хочу доставать через запрос данные из sql'а, чтобы потом добавить эти данные в датафрейм (добавляется новая колонка с фамилией, и на строке ID соответствует данной фамилии). Но в результате работы добавляется только последняя строка, что делаю не так?
import pypyodbc
import pandas as pd
server = 'DMITRY\SQLEXPRESS'
database = 'RGSNEW1'
cnxn = pypyodbc.connect('DRIVER={SQL Server};SERVER='+server+';DATABASE='+database)
cursor = cnxn.cursor()
xlsx = pd.read_excel("dat1.xlsx", dtype={"A6": str)# как строка потому что в SQL это большое число строчного типа
for ind in range (len(xlsx)):
id_excel = xlsx.iloc[ind]["A6"]
query = (f"""
SELECT Pers.Surname
FROM Pers
WHERE Pers.ID = '{id_excel}'
""")
dtb1 = pd.read_sql(query, cnxn)
dtb2 = pd.concat ([xlsx, dtb1],axis=1,ignore_index=True)#склеивание по столбцам, в этом и ошибка, использовать append?
dtb2.to_excel("concat.xlsx")
print(dtb1)
print(dtb2)
Ответы (1 шт):
Автор решения: Андрей Ковров
→ Ссылка
Сделал так, работает:
import pypyodbc
import pandas as pd
server = 'DMITRY\SQLEXPRESS'
database = 'RGSNEW1'
cnxn = pypyodbc.connect('DRIVER={SQL Server};SERVER='+server+';DATABASE='+database)
cursor = cnxn.cursor()
xlsx = pd.read_excel("dat1.xlsx", dtype={"A6": str})
dtb = pd.DataFrame()
for ind in range (len(xlsx)):
id_excel = xlsx.iloc[ind]["A6"]
query = (f"""
SELECT Pers.Surname
FROM Pers
WHERE Pers.ID = '{id_excel}'
""")
dtb1 = pd.read_sql(query, cnxn)
dtb = pd.concat ([dtb, dtb1], ignore_index=True)
xlsx = pd.concat([xlsx, dtb], axis = 1)
for ind1 in range (len(xlsx)):
print(ind1)
for ind in range (len(xlsx)):
if xlsx.iloc[ind1]['A6'] == xlsx.iloc[ind]['enp']:
xlsx.at[ind1, 'A51'] = xlsx.iloc[ind]['surname']#присвоение в нужный столбец
break
xlsx.drop(columns = ['surname'],axis = 1, inplace=True)#чистка от лишних столбцов
xlsx.to_excel("done.xlsx")