Pandas:在整个数据框上应用复杂函数的最有效方法

6

我有一个需要进行分组、过滤、修改并应用自定义函数的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()调用的输出。


过滤掉同一组内所有[y]值相同的行。您如何决定保留哪些重复项,丢弃哪些重复项(例如,相同的num和y值,但不同的place值)?同样地,如果一组中有超过6个重复项,您如何决定保留哪些?您可能希望将此问题分解成较小的部分。 - Alexander
1个回答

1

尝试使用GroupBy.aggregate(func, *args, **kwargs)[source]来聚合您的三个任务。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接