所以,我想知道我是否正确执行此操作,因为也许有更好的方法来执行此操作,而我却浪费了很多时间。
我有一个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个小时。我知道这需要花很多时间,因为访问量很多,但是我想知道是否可以有一种更快的方法进行搜索。
更多信息:
答案:
df['NewData'] = df.groupby(level=['IndexA', 'IndexB'])['ColumnB'].shift(7)
答案 0 :(得分:1)
您真正要做的就是转变。您可以像这样将其加速1000倍:
Foo, "a, b", Bar
您需要将数据从顶部的df['NewData'] = df['ColumnB'].shift(-someConstantValue)
行数滚动到底部,这是我的练习。