Python计算字段函数

2024-04-23 09:28:19 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图创建一个函数,根据(收入预算)计算利润。收入中有0个我不想在计算中使用的值。你知道吗

这是我到目前为止所做的,但它正在抛出错误 ValueError:序列的真值不明确。使用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')

Tags: 函数orgdata错误序列calbudgetvalueerror
1条回答
网友
1楼 · 发布于 2024-04-23 09:28:19

得到该错误是因为if语句正在检查列作为一个整体是否等于0。这将取决于每个值,因此它认为它是“不明确的”。你知道吗

我能想出三种不同的方法来达到你想要的结果。你知道吗

首先,@Wen建议的版本(他只是错过了一个符号):

    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个回路)

第一个功能是最快的!你知道吗

现在,您似乎在尝试使函数变得灵活(因为您允许使用不同的列名)。我是否可以建议将数据帧本身的名称也作为函数的参数?你知道吗

这将是功能1的更新版本,具有额外的灵活性:

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')

好好享受!你知道吗

相关问题 更多 >