Для данного pandas dataframe df , который выглядит следующим образом:
p_id | sales | salesperson | year
1 | 10,000| None | 2017
2 | 15,000| None | 2016
5 | 7,000 | None | 2014
5 | 3,000 | None | 2015
Существует таблица SQL, person , которая выглядит следующим образом:
p_id | p_name | from_year | to_year
1 | Brian Griffin | 2017 | Null
2 | Quagmire | 2016 | Null
5 | Cleveland | 2014 | 2015
5 | Lois Griffin | 2015 | Null
Я пытаюсь заполнить отсутствующие данные в моем кадре данных из таблицы SQL.P_id может быть повторно использован, если он используется 1 человеком за раз.
Я сделал следующее:
for index, row in df.iterrows():
df.at[index, 'salesperson'] = fetch_name(row['p_id'], row['year'])
def fetch_name(pid, year):
meta = sqlalchemy.MetaData()
persons = sqlalchemy.Table('persons', meta, autoload=True, autoload_with=data_engine)
stmt = sqlalchemy.select([persons.c.p_name]).where(
and_(persons.c.p_id == pid, and_(year >= persons.c.from_year,
or_(year < persons.c.to_year, persons.c.to_year.is_(None))))
name = data_engine.execute(stmt).scalar()
return name
Это отлично работает, но очень медленно.Для кадра данных из 30 000 строк требуется около 20 минут для сопоставления и заполнения отсутствующих данных.
Есть ли лучший способ достичь того же результата?