熊猫:在整个数据框架上应用复杂功能的最有效方法

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()调用的输出,因此它在一段时间后变得非常慢

sto*_*vfl 1

尝试GroupBy.aggregate(func, *args, **kwargs)[source]汇总您的三项任务。