我试图计算一个折扣,我想应用到我的数据帧的两列中的每一行,并将结果添加到一个新列中。
我已经尝试了很多方法,通过遵循现有的例子,但是每次都发生错误。
我将函数定义为:
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()。
我也尝试应用这里的所有建议,但每次都出现错误。
您应该将此计算应用于具有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
您也可以尝试:
ordini["discount"] = [delta_perc(a,b) for a,b in zip(ordini["revenue1"],ordini["revenue2"])]
你把一些概念搞混了。当您使用熊猫时。数据帧。应用
(使用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传递给下面的函数来创建新列?