Я хочу знать, есть ли способ оптимизировать поиск, который я делаю.У меня есть многоиндексный (3 уровня) фрейм данных df
, например:
IndexID IndexDateTime IndexAttribute ColumnA ColumnB
1 2015-02-05 8 A B
1 2015-02-05 7 C D
1 2015-02-10 7 X Y
Моя проблема в том, что я хочу знать, есть ли у определенной даты, скажем, например, 2015-02-10
данные вColumnA
, с теми же IndexID
и IndexAttribute
, заданным днем ранее (5 в данном случае), и, если оно есть, получите его и добавьте в новый столбец, например:
IndexID IndexDateTime IndexAttribute ColumnA ColumnB NewColumn
1 2015-02-05 8 A B -1
1 2015-02-05 7 C D -1
1 2015-02-10 7 X Y C
Я хочу выполнить этот поиск для каждой строки в моем фрейме данных, который имеет 19 миллионов строк.Вот как я это делаю:
df['NewColumn'] = df.apply(lambda r: get_data(df, r.IndexID, r.IndexDateTime , r.IndexAttribute , 5), axis=1)
Где get_data
:
def get_data(df, IndexID, IndexDateTime , IndexAttribute , days_before):
idx = pd.IndexSlice
date = (IndexID - pd.to_timedelta(days_before, 'd'))
try:
res = df.loc[idx[IndexID, date, IndexAttribute ],'ColumnA']
return res
except KeyError:
return -1
Это очень медленно, занимает более 2 часов.Мне было интересно, может ли это быть быстрее.Проблемы:
- Дата для поиска может существовать, а может и не существовать.
- Для каждого
IndexDateTame
я не могу знать, сколько IndexAttributes.Они считаются целыми числами и располагаются в порядке убывания.
Я не могу сделать сдвиг, потому что не знаю, сколько данных находится в середине двух строк.Некоторые идеи?Спасибо!