繁体   English   中英

在 groupby 之后基于条件 dataframe 应用 function

[英]Applying function based on a condtion dataframe after groupby

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

假设我们想在 groupby 之后应用 function 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() 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)`。

现在我想申请 function

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

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

您可以创建一个 function 为您执行此操作:-

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)

Output:-

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

尝试:

df.groupby(by = ["index"]).transform(lambda x: [0 if y == 0 else 1/y for y in x.to_list()])

这适用于多列:

df = pd.DataFrame({'index': [0, 0, 0, 1, 1, 1], 'A':[0,1,2,3,4, 5], 'B':[50, 40,30,20,10, 0]})

print(df)

   index  A   B
0      0  0  50
1      0  1  40
2      0  2  30
3      1  3  20
4      1  4  10
5      1  5   0

df.groupby(by = ["index"]).transform(lambda x: [0 if y == 0 else 1/y for y in x.to_list()])

Output:

          A         B
0  0.000000  0.020000
1  1.000000  0.025000
2  0.500000  0.033333
3  0.333333  0.050000
4  0.250000  0.100000
5  0.200000  0.000000

解释

由于groupby.apply()与 dataframe 一起传递,因此lambda x x中的 x 实际上是基于组的 dataframe 的一小部分。 因此,文本x == 0将 dataframe 与 0 进行比较并给出错误。

对于groupby.transform() ,它使用 Series 而不是 dataframe 传递。 因此,我们可以使用Series.to_list() function 来获取其各个元素并逐个处理它们。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM