Python 3.x 应用通用函数(x,y)从两个现有列创建一个新列,以便我可以将该函数用于不同的列

Python 3.x 应用通用函数(x,y)从两个现有列创建一个新列,以便我可以将该函数用于不同的列,python-3.x,pandas,function,dataframe,apply,Python 3.x,Pandas,Function,Dataframe,Apply,我试图计算一个折扣,我想应用到我的数据帧的两列中的每一行,并将结果添加到一个新列中 我已经尝试了很多方法,通过遵循现有的示例,但每次都会出现错误 我将函数定义为: def delta_perc(x,y): if y == 0: return 0 else: return (x-y)/x*100 然后尝试将该函数应用于我的数据帧 ordini["discount"] = ordini.apply(delta_perc(ordini["revenue

我试图计算一个折扣,我想应用到我的数据帧的两列中的每一行,并将结果添加到一个新列中

我已经尝试了很多方法,通过遵循现有的示例,但每次都会出现错误

我将函数定义为:

def delta_perc(x,y):
    if y == 0:
        return 0
    else:
        return (x-y)/x*100
然后尝试将该函数应用于我的数据帧

ordini["discount"] = ordini.apply(delta_perc(ordini["revenue1"],ordini["revenue2"]), axis=1)
我希望有一个新的列,其中每一行都是应用于ordini[“revenue1”]和ordini[“revenue2”]的函数的结果

但我得到了以下错误:

ValueError:序列的真值不明确。使用a.empty、a.bool()、a.item()、a.any()或a.all()。


我还尝试应用来自的所有建议,但每次都出现错误。

您是否尝试过像这样在
apply
中添加
lambda

ordini["discount"] = ordini.apply(
    lambda x: delta_perc(x["revenue1"], x["revenue2"]), axis=1
)
如果性能对你很重要,试试这个

import numpy as np

delta_perc_vec = np.vectorize(delta_perc)
ordini["discount"] = delta_perc_vec(df["revenue1"].values, df["revenue2"].values)
您也可以尝试:

ordini["discount"] = [delta_perc(a,b) for a,b in zip(ordini["revenue1"],ordini["revenue2"])]

您应该将此计算应用于具有
np的整个系列。其中

import pandas as pd
import numpy as np

def delta_perc(x, y):
    return np.where(y != 0, (x-y)/x*100, 0)
    # I think you may want when x != 0, since you divide by x: 
    #return np.where(x != 0, (x-y)/x*100, 0)
例子:
你把一些概念搞混了。使用
pandas.DataFrame.apply
(使用
axis=1
)时,您正在迭代每一行,并将该行(作为
pandas.Series
对象)传递给调用
apply
时使用的函数

第一个故障点 而是在
apply
中调用函数,并向函数传递两列。这将把函数的返回值传递给
apply
。由于您的函数没有传回可调用对象,因此应该会失败

第二个故障点 此外,您的函数被设计为查看标量值,因此当y==0:
时,当您传递列(如
ordini[“revenue1”]
(这是
pandas.Series
对象)时,它会尝试计算
如果pandas.Series==0:
,这就是生成错误的原因:


方法#1 修复您的功能,不要使用
apply

def delta_perc(x, y):
    return x.sub(y).div(x).mask(x == 0, 0).mul(100)

ordini["discount"] = delta_perc(ordini["revenue1"], ordini["revenue2"])
def delta_perc(x, y):
    if x == 0:
        return 0
    else:
        return (x - y) / x * 100

# Because remember `apply` takes a function that gets a row (or column) passed to it
ordini["discount"] = ordini.apply(
    lambda row: delta_perc(row['revenue1'], row['revenue2']),
    axis=1
)

进近#2 修复您的函数并使用
map
。这类似于使用理解

def delta_perc(x, y):
    if x == 0:
        return 0
    else:
        return (x - y) / x * 100

ordini["discount"] = [*map(delta_perc, ordini["revenue1"], ordini["revenue2"])]

方法#3 实际使用
apply

def delta_perc(x, y):
    return x.sub(y).div(x).mask(x == 0, 0).mul(100)

ordini["discount"] = delta_perc(ordini["revenue1"], ordini["revenue2"])
def delta_perc(x, y):
    if x == 0:
        return 0
    else:
        return (x - y) / x * 100

# Because remember `apply` takes a function that gets a row (or column) passed to it
ordini["discount"] = ordini.apply(
    lambda row: delta_perc(row['revenue1'], row['revenue2']),
    axis=1
)

如果你除以
x
,结果是
np.inf
,你确定是在
y==0
而不是
x==0
时返回0吗?当然!当我专注于代码的第二部分时,我犯了一个更大的错误。谢谢!你给了我非常宝贵的见解!