首页 > 解决方案 > 在 groupby 之后基于条件数据帧应用函数

问题描述

我想在 groupby 之后对一组数字执行一个函数,但是这个函数只有在满足某个条件时才有效。有没有办法执行两种不同的操作?

假设我们想在 groupby 之后应用函数 1/x。对于 x==0 当然不能这样做,但我们只想得到 0 作为返回值。通常,这看起来像这样

if x > 0: return 1/x else: return 0

然而,做

df.groupby(by = ["index"]).apply(lambda x: 0 if x == 0 else 1/x)

给我一个错误信息: ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all()

构建的数据如下:

在 groupby 之后,我只剩下

df = | 索引| 值1| | --- | -----| | 一个 |0 | | 乙 | 0.5| | c | 0.2|,索引不再可调用。

我也有数据集

dg =

指数 价值2 价值3
一种 1 5
一种 2 8
C 3 7
C 7 7
b 5 6
b 7 13

我加入索引使用

dh = pd.merge(dg, df, how = 'left', on = index)`。

现在我想应用该功能

dh.groupby(by=index).apply(lambda x: (((x.value2/x.value3) - x.value1)**2).sum() / (x.value1 * (x.n.count())),

当 value1 等于 0 时显然不能执行。如前所述放入条件会给我上述错误。我该怎么办?

标签: pythonpandasconditional-statementspandas-groupbypandas-apply

解决方案


您可以创建一个为您执行此操作的函数:-

def func(x):
    if x['value1'].gt(0).all():
        return 1/x['value1']
    else:
        return ((((x['value2']/x['value3'])-x['value1'])**2).sum()/x['value1']*x['value1'].count())

现在只需使用:-

dh.groupby(by = ["index"]).apply(func)

输出:-

index   
a      0    inf
       1    inf
b      4    2.0
       5    2.0
c      2    5.0
       3    5.0

推荐阅读