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

时间:2017-02-23 14:00:19

标签: python algorithm performance pandas dataframe

我有一个需要分组,过滤,修改并应用自定义功能的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]上对df进行分组,即:

[name]  [cnt]   [num]    [place]  [y]

AAAA     12    20182.0     5.0   1.75
BBBB     12    20182.0     7.0   2.00

对于每个小组,我需要完成三项任务:

予。过滤掉具有相同[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的[所需]列包含平均自定义函数结果'在所有子集中,AAAA的位置值是元组的第一部分。在这个例子中,这只是一个元组。

(但是如上所述,这些组最多可以包含6个值,这将创建多个元组,其中AAAA的位置是第一个值)

我目前的做法是做一个

  

df.groupby(' NUM&#39)。应用(...)

申请将做:

  

.drop_duplicates(' Y',保持=假)

     

list(itertools.permutations(df_grp.place.values,2))

     

应用自定义功能

     

.mean()

一段时间之后变得真的很慢,因为第一个df是来自另一个.groupby()的输出.apply()调用

1 个答案:

答案 0 :(得分:1)

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