我有一个函数可以与数据框中的日期进行比较,并在基本计算后返回一个值:
def SDate(x,y):
s=1
a = min(x,y)
b = max(x,y)
if a !=x: s = -1
r = b-a
if b-a > 182:
r = 365-b+a
return(r * s)
我尝试使用以下内容,但出现错误:
df['Result']= SDate(df['GL Date'].dt.dayofyear,df['Special Date'].dt.dayofyear )
但是我有一个
ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().
答案 0 :(得分:0)
您以if(x < bkp) {
y <- i1 + s1 * x
} else {
y <- (i1 + s1 * bkp) + s2 * (x - bkp)
}
和x
的形式给予熊猫系列。因此,函数min无法接收到该对象。由于我不知道您在做什么,所以无法在代码上解决该问题。
希望它能起作用。
答案 1 :(得分:0)
问题出在min/max
个函数上,它们不适用于Series
个对象。考虑使用此:
a = min(x.min(), y.min())
b = max(x.max(), y.max())
但是,然后将Series
与一个数字if a != x:
进行比较-也会失败。功能的目的是什么?
答案 2 :(得分:0)
我不确定您要实现的目标到底是什么,但是您似乎正在尝试将函数的输入设置为一系列并获取按行输出,这是不明智的,因为您希望输出位于数据框。
包括尝试使用的数据样本以及所需的输出内容,以及对要实现的内容的详细说明也是一种很好的做法。
话虽如此,根据您的描述-您应该将apply方法用作行操作来获取输出。
因此,如果您希望应用此功能:
def SDate(x,y):
s=1
a = min(x,y)
b = max(x,y)
if a !=x: s = -1
r = b-a
if b-a > 182:
r = 365-b+a
return(r * s)
您应该这样做:
df['Result'] = df.apply(lambda x: SDate(x['GL Date'].dt.dayofyear, x['Special Date'].dt.dayofyear), axis = 1)
答案 3 :(得分:0)
您可以尝试axis
的{{1}}参数:
df.apply
当您将GL日期和特殊日期年份传递给函数时,实际上是传递了def SDate(row):
s=1
year1=row['GL Date'].year
year2= row['Special Date'].year
a = min(year1,year2)
b = max(year1,year2)
if a !=year1:
s = -1
r = b-a
if b-a > 182:
r = 365-b+a
return(r * s)
df['Result']= df.apply(SDate, axis=1)
,这是因为您无法比较Series与Series
或{{ 1}}个运算符。因此结果是不明确的。无法确定哪个更大。因此,您得到的错误。
使用应用功能<
时,它将逐行应用该功能。