我想有矢量计算,因为apply or df.iterrows()
是缓慢的。下面的代码工作正常,给出预期的结果
import pandas as pd
df = pd.DataFrame({"a": [0, 12, 0, 5], "b": [5, 89, 45, 6], "c": [85, 23, 14, 10]})
def cal(data):
val1 = data["a"]
val2 = data["b"]
val3 = data["c"]
return val1+val2, val1-val2, val1*val3
df["add"], df["subract"], df["multiply"] = cal(df)
a b c add subract multiply
0 0 5 85 5 -5 0
1 12 89 23 101 -77 276
2 0 45 14 45 -45 0
3 5 6 10 11 -1 50
现在我想让val 1,val 2,val 3 =0,只要dataframe中a
列的任何一行是0。
def cal_with_zero(data):
if data["a"] == 0:
val1 = 0
val2 = 0
val3 = 0
else:
val1 = data["a"]
val2 = data["b"]
val3 = data["c"]
return val1+val2, val1-val2, val1*val3
df["add"], df["subract"], df["multiply"] = cal_with_zero(df)
代码行if data["a"] == 0:
出错
ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().
我想要的结果是
a b c add subract multiply
0 0 5 85 0 0 0
1 12 89 23 101 -77 276
2 0 45 14 0 0 0
3 5 6 10 11 -1 50
我想有一个矢量化的方法,而不是apply or df.iterrows()
。我想有函数cal_with_zero
,因为在传递的 Dataframe 有很多条件,确定val 1的值,val 2,val 3在实际代码中,由于我无法使用np.where
,可能是我错过了一些事情。
先谢谢你了!
2条答案
按热度按时间vatpfxk51#
你可以使用numpy的where函数来实现这个. np.where很棒。你输入你的条件,然后当条件为真时你想要设置什么,然后当条件为假时你想要设置什么。对于你的情况。
wko9yo5t2#
使用单个
numpy.where
子句: