我有一个需要进行分组、过滤、修改并应用自定义函数的df。我的“正常”方法效率很低,而且不太优雅!
[name] [cnt] [num] [place] [y]
AAAA 12 20182.0 5.0 1.75
BBBB 12 20182.0 7.0 2.00
AAAA 10 20381.0 10.0 9.25
BBBB 10 20381.0 12.0 18.75
EEEE 12 21335.0 1.0 0.00
RRRR 12 21335.0 8.0 3.00
CCCC 12 21335.0 9.0 3.50
我需要按[num]对数据框进行分组,即:
[name] [cnt] [num] [place] [y]
AAAA 12 20182.0 5.0 1.75
BBBB 12 20182.0 7.0 2.00
针对每个组,我需要完成以下三个任务:
I. 过滤掉所有[y]值相同的行。每个组最多可以包含6个值。
II. 为[place]创建所有可能的长度为2的子集:(5,7)和(7,5)
III. 对每个子集应用自定义函数:
def func(p1, p2):
diff_p = p2-p1
if diff_p > 0:
return 2 / (diff_p * p2)
else:
return p1 / (diff_p * 12)
p1表示元组的第一个位置;p2表示元组的第二个位置;12是[cnt]列中的值。这为示例组提供了:
[name] [cnt] [num] [place] [y] [desired]
AAAA 12 20182.0 5.0 1.75 0.1428571429
BBBB 12 20182.0 7.0 2.00 -0.2916666667
AAAA的[desired]列存储了所有子集的平均“自定义函数结果”,其中AAAA的位置是元组的第一部分。在此示例中,这只是一个元组。
(但是,如上所述,组可以由多达6个值组成,这将创建多个元组,其中AAAA的位置是第一个值)
我当前的方法是执行
df.groupby('num').apply(...)
应用将执行:
.drop_duplicates('y',keep=False)
list(itertools.permutations(df_grp.place.values, 2))
应用自定义函数
.mean()
在一段时间后它变得非常缓慢,因为第一个数据框是另一个.groupby().apply()调用的输出。