jum*_*mbo 6 python algorithm performance dataframe pandas
我有一个需要分组,过滤,修改和应用自定义功能的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
Run Code Online (Sandbox Code Playgroud)
我需要在[num]上对df进行分组,即:
[name] [cnt] [num] [place] [y]
AAAA 12 20182.0 5.0 1.75
BBBB 12 20182.0 7.0 2.00
Run Code Online (Sandbox Code Playgroud)
对于这些组中的每一组,我需要完成三项任务:
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)
Run Code Online (Sandbox Code Playgroud)
其中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
Run Code Online (Sandbox Code Playgroud)
AAAA的[期望]列保存所有子集的平均"自定义函数结果",其中AAAA的位置值是元组的第一部分.在这个例子中,这只是一个元组.
(但是如上所述,这些组最多可以包含6个值,这将创建多个元组,其中AAAA的位置是第一个值)
我目前的做法是做一个
df.groupby( '民').申请(......)
申请将做:
.drop_duplicates( 'Y',保持=假)
list(itertools.permutations(df_grp.place.values,2))
应用自定义功能
.意思()
由于第一个df是另一个.groupby().apply()调用的输出,因此它在一段时间后变得非常慢