Python pandas计算字段函数

时间:2018-02-02 20:06:14

标签: python pandas

我试图根据(收入 - 预算)创建一个计算利润的函数。 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')

1 个答案:

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

享受!