【发布时间】:2018-12-28 18:36:42
【问题描述】:
我想知道是否有办法优化我正在做的搜索。我有一个多索引(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
我想在我的数据框中的每一行上执行这个搜索,它有 1900 万行。我这样做的方式是:
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。 它们是 int 思想,它们是按降序排列的。
我不能换班,因为我不知道两行中间有多少数据。一些想法?谢谢!
【问题讨论】:
标签: python-3.x pandas search optimization multi-index