5

applyデータフレームの関数内のラムダ関数で三項演算子を使用するにはどうすればよいpandasですか?

まず第一に、このコードは 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)

、何らかの理由で結果のデータフレームを取得できます(ただし、それは私がやりたかったことではありません)。

ありがとう。

[アップデート]

申し訳ありませんが、元の例は二項演算子として使用できる1andを使用するため、三項演算子の使用に関しては適切ではありません。0したがって、更新された R/plyr コードは次のとおりです。

ddply(mtcars, .(cyl), summarise, sum(ifelse(carb==4,6,3))/sum(ifelse(carb %in% c(4,1),8,4)))

この状況で三項演算子を使用することは可能ですか?

4

3 に答える 3