[英]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.