我试图根据(收入 - 预算)创建一个计算利润的函数。 Revenue中有0个值,我不想在计算中使用。
这是我到目前为止所做的事情,但是它正在抛出错误' ValueError:Series的真值是不明确的。使用a.empty,a.bool(),a.item(),a.any()或a.all()。
# Function to calcuate the profit only when there is a non 0 value for Budget var1- revenue, var2 - budget, var3 profit
def profit_cal(var1,var2,var3):
if(org_data[var1]!=0):
org_data[var3]=org_data[var1]-org_data[var2]
else:
org_data[var3]=0
return(org_data[var3])
profit_cal('revenue','budget','profit')
答案 0 :(得分:0)
您收到该错误是因为if语句正在检查整个列是否等于0.这将取决于每个值,因此它认为它是“不明确的”。
我可以想出实现你所追求的结果的3种不同方式。
首先,@ Win建议的版本(他只错过了一个标志):
def profit_cal1(var1,var2,var3):
org_data[var3] = (org_data[var1]-org_data[var2]).where(org_data[var2]!=0,0)
现在,您迭代的版本抛出每一行以检查预算值是否等于0:
def profit_cal2(var1,var2,var3):
org_data[var3] = 0
for idx,i in enumerate(org_data[var2]):
if i!=0:
org_data[var3][idx] = org_data[var1][idx]-org_data[var2][idx]
最后,通过计算整个表的'利润',然后用0替换你不想要的值:
def profit_cal3(var1,var2,var3):
org_data[var3] = org_data[var1] - org_data[var2]
org_data.loc[org_data[var2]==0,var3] = 0
让我们使用%timeit来查看哪一个最有效!
# Creating a dummy dataframe with zeros in it
org_data = pd.DataFrame()
org_data['revenue'] = np.random.choice(range(100),10000)
org_data['budget'] = np.random.choice(range(100),10000)
结果:
%timeit profit_cal1('revenue','budget','profit')
每回路873μs±4.12μs(平均值±标准偏差,7次运行,每次1000次循环)
%timeit profit_cal2('revenue','budget','profit')
每循环1.07 s±4.46 ms(平均值±标准偏差,7次运行,每次循环1次)
%timeit profit_cal3('revenue','budget','profit')
3.41 ms±86.5μs/循环(平均值±标准偏差,7次运行,每次100次循环)
第一个功能是最快的!
现在,您似乎正在尝试使函数变得灵活(因为您允许使用不同的列名称。我是否可以建议将数据帧的名称本身作为函数的参数?
这将是功能一的更新版本,具有额外的灵活性:
def profit_cal(X,var1,var2,var3):
X[var3] = (X[var1]-X[var2]).where(X[var2]!=0,0)
请记住,你必须再输入一个参数:
profit_cal(org_data,'revenue','budget','profit')
享受!