我该如何在pandas
数据框的apply
函数中使用三元运算符的lambda表达式?
首先,这段代码来自于R/plyr,这正是我想要的:
ddply(mtcars, .(cyl), summarise, sum(ifelse(carb==4,1,0))/sum(ifelse(carb %in% c(4,1),1,0)))
在上述函数中,我可以使用
ifelse
函数,R的三元运算符,来计算结果数据框。但是,当我想在Python/pandas中使用以下代码实现相同的功能时:mtcars.groupby(["cyl"]).apply(lambda x: sum(1 if x["carb"] == 4 else 0) / sum(1 if x["carb"] in (4, 1) else 0))
出现以下错误:
ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()
那么我怎么才能计算并得到与R/plyr中相同的数据框呢?
需要说明的是,如果我在不对列进行分组的情况下使用三目运算符,例如:
mtcars.apply(lambda x: sum(1 if x["carb"] == 4 else 0) / sum(1 if x["carb"] in (4, 1) else 0), axis=1)
我可以出于某些原因获得结果数据框(但这不是我想要做的)。
谢谢。
[更新]
抱歉,原始示例在使用三元运算符时并不好,因为它使用了可以用作二进制的1
和0
。因此,更新后的R/plyr代码如下:
ddply(mtcars, .(cyl), summarise, sum(ifelse(carb==4,6,3))/sum(ifelse(carb %in% c(4,1),8,4)))
在这种情况下使用三元运算符是否可行?
(x == 4).astype(float)
替换为(x == 4)*1
,在我的测试中对于大型数组速度更快,但我不确定它的普适性。 - cwharland1
和0
,这可以很容易地转换为true/false
二进制数。所以我更新了原帖。抱歉。 - Blaszard