熊猫的优化问题适用于多索引搜索

时间:2018-11-12 11:00:34

标签: python pandas optimization apply multi-index

所以,我想知道我是否正确执行此操作,因为也许有更好的方法来执行此操作,而我却浪费了很多时间。

我有一个3级索引数据框,如下所示:

IndexA IndexB IndexC   ColumnA  ColumnB
   A      B      C1      HiA     HiB
   A      B      C2      HiA2    HiB2

我需要搜索每一行,保存其他行的数据。我知道这听起来很奇怪,但是对我的数据来说却很有意义。例如: 我想将第二行中的ColumnB数据添加到第一行中,反之亦然,就像这样:

IndexA IndexB IndexC   ColumnA  ColumnB  NewData
   A      B      C1      HiA     HiB       HiB2
   A      B      C2      HiA2    HiB2      HiB

为了进行此搜索,我在apply上执行了df,如下所示:

df['NewData'] = df.apply(lambda r: my_function(df, r.IndexA, r.IndexB, r.IndexC), axis=1)

我的职能是

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个小时。我知道这需要花很多时间,因为访问量很多,但是我想知道是否可以有一种更快的方法进行搜索。

更多信息:

  • 在indexA上,我有不同的值组。例如:国家/地区。
  • 在indexB上,我有不同的日期组。
  • 在indexC上,我有不同的值组。

答案:

df['NewData'] = df.groupby(level=['IndexA', 'IndexB'])['ColumnB'].shift(7)

1 个答案:

答案 0 :(得分:1)

您真正要做的就是转变。您可以像这样将其加速1000倍:

Foo, "a, b", Bar

您需要将数据从顶部的df['NewData'] = df['ColumnB'].shift(-someConstantValue) 行数滚动到底部,这是我的练习。