当前位置: 首页 > 知识库问答 >
问题:

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

贲绪
2023-03-14

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

我已经尝试了很多方法,通过遵循现有的例子,但是每次都发生错误。

我将函数定义为:

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()。

我也尝试应用这里的所有建议,但每次都出现错误。

共有3个答案

谭铭
2023-03-14

您应该将此计算应用于具有np.where的整个Series:

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)
np.random.seed(12)
df = pd.DataFrame(np.random.randint(0,10,(10,2)))

df['new_col'] = delta_perc(df[0], df[1])
#   0  1     new_col
#0  6  1   83.333333
#1  2  3  -50.000000
#2  3  0    0.000000
#3  6  1   83.333333
#4  4  5  -25.000000
#5  9  2   77.777778
#6  6  0    0.000000
#7  5  8  -60.000000
#8  2  9 -350.000000
#9  3  4  -33.333333
锺英卫
2023-03-14

您也可以尝试:

ordini["discount"] = [delta_perc(a,b) for a,b in zip(ordini["revenue1"],ordini["revenue2"])]
韩喜
2023-03-14

你把一些概念搞混了。当您使用熊猫时。数据帧。应用(使用axis=1)您正在迭代每一行,并将该行(作为pandas.Series对象)传递给调用apply时使用的函数。

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

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

ValueError: The truth value of a Series is ambiguous.

修复您的功能,不要使用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"])

修复你的函数并使用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"])]

实际使用应用

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:这个问题是在V0.11.0左右提出的。因此,许多问题和答案都不太相关。

  • 我有一个pandas数据框,其中包含列和。我想从他们那里得到和。中有一个函数,名为,用于执行此操作。它接收和,并给出。我是这样做的: 我想定义一个函数并应用一次以节省时间。我看了看这里,这里和这里,但是我找不到一种方法来使用一个函数制作两列。谢谢。

  • 问题内容: 我有一个熊猫DataFrame,其中包含多个列: 我想基于对数据框的每一行应用一个函数为此数据框创建两个新列。我不想多次调用该函数(例如,通过执行两次单独的调用),因为它占用大量计算资源。我尝试通过两种方式来执行此操作,但它们都不起作用: 使用: 我编写了一个函数,该函数接受a并返回我想要的值的元组: 尝试将此应用于DataFrame会出现错误: 然后,我将使用此问题中显示的方法将从返

  • 问题内容: 您可以使用两个不同的列中的值作为参数来制作python pandas函数吗? 我有一个函数,如果两列的值在相同范围内,则返回1。否则返回0: 我希望第一个参数成为数据框中的一列,以使函数将采用该列中每一行的值。例如是,第二个参数是df [‘ResponseCol’]`。我希望结果是数据框中的新列。我遇到了几个 回答了类似问题的线程,但看起来这些参数是变量,而不是数据帧行中的值。 我尝试

  • 考虑下面的数据集存储在熊猫数据文件<代码> DFX < /代码>: 我有一个函数是: 现在,我想在中创建一个新列,其中包含计算出的z值 查看其他SO示例,我尝试了几个变体,包括: 返回错误。正确的方法是什么?

  • 我想通过对两个现有列应用函数,在数据框中创建一个新列。根据这个答案,当我只需要一列作为参数时,我就能够创建一个新列: 但是,当函数需要多个参数时,我不知道如何执行相同的操作。例如,如何通过将列a和列B传递给下面的函数来创建新列?