【发布时间】:2018-11-12 11:00:34
【问题描述】:
所以,我想知道我这样做是否正确,因为也许有更好的方法可以做到这一点,而我正在浪费很多时间。
我有一个 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
为了进行此搜索,我在我的 df 上执行了 apply,如下所示:
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)
【问题讨论】:
-
我建议您根据您的公式添加新的
new_ColumnB和new_ColumnC列,而不是修改索引。最后设置新的索引。 -
@has我做不到,修改索引C的重点是知道它是否存在。如果我添加一个新列,它就会存在,我会得到错误的数据。
-
问题的整个有趣部分是您省略的部分(“我在这里进行计算”)。请包括在内。
-
@JohnZwinck 我写的,它只是 C 的减法 - 一个常量值。不再进行计算。
标签: python pandas optimization apply multi-index