Python 应用多索引搜索的优化问题
所以,我想知道我这样做是否正确,因为也许有更好的方法来做这件事,我浪费了很多时间 我有一个3级索引数据帧,如下所示:Python 应用多索引搜索的优化问题,python,pandas,optimization,apply,multi-index,Python,Pandas,Optimization,Apply,Multi Index,所以,我想知道我这样做是否正确,因为也许有更好的方法来做这件事,我浪费了很多时间 我有一个3级索引数据帧,如下所示: IndexA IndexB IndexC ColumnA ColumnB A B C1 HiA HiB A B C2 HiA2 HiB2 IndexA IndexB IndexC ColumnA ColumnB NewData A B C1 H
IndexA IndexB IndexC ColumnA ColumnB
A B C1 HiA HiB
A B C2 HiA2 HiB2
IndexA IndexB IndexC ColumnA ColumnB NewData
A B C1 HiA HiB HiB2
A B C2 HiA2 HiB2 HiB
df['NewData'] = df.apply(lambda r: my_function(df, r.IndexA, r.IndexB, r.IndexC), axis=1)
df['NewData'] = df['ColumnB'].shift(-someConstantValue)
我需要搜索每一行,保存其他行的数据。我知道这听起来很奇怪,但从我的数据来看是有道理的。例如:
我想将ColumnB
数据从第二行添加到第一行,反之亦然,如下所示:
IndexA IndexB IndexC ColumnA ColumnB
A B C1 HiA HiB
A B C2 HiA2 HiB2
IndexA IndexB IndexC ColumnA ColumnB NewData
A B C1 HiA HiB HiB2
A B C2 HiA2 HiB2 HiB
df['NewData'] = df.apply(lambda r: my_function(df, r.IndexA, r.IndexB, r.IndexC), axis=1)
df['NewData'] = df['ColumnB'].shift(-someConstantValue)
为了执行此搜索,我在我的df
上执行apply
,如下所示:
IndexA IndexB IndexC ColumnA ColumnB
A B C1 HiA HiB
A B C2 HiA2 HiB2
IndexA IndexB IndexC ColumnA ColumnB NewData
A B C1 HiA HiB HiB2
A B C2 HiA2 HiB2 HiB
df['NewData'] = df.apply(lambda r: my_function(df, r.IndexA, r.IndexB, r.IndexC), axis=1)
df['NewData'] = df['ColumnB'].shift(-someConstantValue)
我的职能是:
def my_function(df, indexA, indexB, indexC):
idx = pd.IndexSlice
#Here I do calculations (substraction) to know what C exactly I want
#newIndexC = C - someConstantValue
try:
res = df.loc[idx[IndexA, IndexB, newIndexC],'ColumnB']
return res
except KeyError:
return -1
我试图简化这个问题,如果它听起来让人困惑,很抱歉。基本上我的数据框有2000万行,这个搜索需要2小时。我知道这需要花费很多时间,因为有很多访问,但我想知道是否有更快的方法进行搜索
更多信息:
df['NewData'] = df.groupby(level=['IndexA', 'IndexB'])['ColumnB'].shift(7)
- 在indexA上,我有不同的值组。例子:国家
- 在indexB上,我有不同的日期组
- 在indexC上,我有不同的值组
df['NewData'] = df.groupby(level=['IndexA', 'IndexB'])['ColumnB'].shift(7)
你真正做的只是换班。您可以将其加速1000倍,如下所示:
IndexA IndexB IndexC ColumnA ColumnB
A B C1 HiA HiB
A B C2 HiA2 HiB2
IndexA IndexB IndexC ColumnA ColumnB NewData
A B C1 HiA HiB HiB2
A B C2 HiA2 HiB2 HiB
df['NewData'] = df.apply(lambda r: my_function(df, r.IndexA, r.IndexB, r.IndexC), axis=1)
df['NewData'] = df['ColumnB'].shift(-someConstantValue)
您需要将数据从顶部
someConstantValue
行数滚动到底部--我将此作为练习。我建议您根据您的公式添加新的new_ColumnB
和new_ColumnC
列,而不是修改索引。最后设置新的索引。@has我不能这样做,修改索引C的关键是要知道它是否存在。如果我添加一个新的列,它就会存在,我会得到错误的数据。你的问题中最有趣的部分就是你忽略的部分(“我在这里做计算”)。请把它包括进去。@JohnZwinck我写的,它只是C-a constat值的一个减法。这里没有更多的计算。糟糕的是,我不能使用shift,因为我会混合数据。我在问题中补充了更多的信息。希望现在更清楚,对不起!想一想,我发现我完全没有解释这个问题,因此这不是解决办法。我应该编辑这个吗?创建一个新问题?只需创建一个新问题,并在此处的评论中发布指向该问题的链接。给你!谢谢你抽出时间。