Python 应用多索引搜索的优化问题

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

所以,我想知道我这样做是否正确,因为也许有更好的方法来做这件事,我浪费了很多时间

我有一个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      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,因为我会混合数据。我在问题中补充了更多的信息。希望现在更清楚,对不起!想一想,我发现我完全没有解释这个问题,因此这不是解决办法。我应该编辑这个吗?创建一个新问题?只需创建一个新问题,并在此处的评论中发布指向该问题的链接。给你!谢谢你抽出时间。