Python 当用户函数包含布尔条件时,为什么传递df列不起作用?

Python 当用户函数包含布尔条件时,为什么传递df列不起作用?,python,python-3.x,Python,Python 3.x,当我在没有布尔条件的情况下将pd系列(例如df列)传递给用户函数时,它就工作了,否则就会失败 错误:序列的真值不明确。使用a.empty, a、 bool()、a.item()、a.any()或a.all() 很抱歉,Python是新手,所以我不明白为什么在一种情况下它处理元素,但在类似布尔数组的情况下 df = pd.DataFrame({'A' : ['football', 'football', 'tennis','tennis','tennis'],

当我在没有布尔条件的情况下将pd系列(例如df列)传递给用户函数时,它就工作了,否则就会失败

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

很抱歉,Python是新手,所以我不明白为什么在一种情况下它处理元素,但在类似布尔数组的情况下

df = pd.DataFrame({'A' : ['football', 'football', 
'tennis','tennis','tennis'],
                   'B' : ['MESSI', 'ROONEY', 'FEDERER','NADAL', 'FEDERER'],
                   'C' : [5,4,6,5,6],
                   'D' : np.random.randn(5),
                   'E' : [1,2,4,3,5],
                   'F' : [1,0,1,0,1]
                  })
def diffs(E, F):
    vals = E - F
    return vals
这项工作:

df.loc[:, 'asd'] =  pd.Series(diffs(df.loc[:,'E'],df.loc[:,'F']), 
index=df.index) 
这一准则是:

def peak_rate(E, F):
    if E > 0:
        vals = 1
    else:
        vals = 0
    return vals

df.loc[:, 'asd'] =  pd.Series(peak_rate(df.loc[:,'E'],df.loc[:,'F']), 
index=df.index)

这是因为,在第一种情况下,它只是减法,两个数组或序列可以加/减/乘,输出仍然是一个序列。对于大于或小于的等式,不能这样做。以下是另一种解决方案:

def peak_rate(E, F):
    if E > F:
        return 1
    else:
        return 0

df.loc[:, 'asd'] =  pd.Series([peak_rate(df["E"][i],df["F"][i]) for i in range(len(df))], index=df.index)
或者您甚至不需要函数
peak\u rate
。你可以这样写(我猜你的意思是
E>F
而不是
E>0
中的
peak\u rate
。如果是
E>0
,只需将
df[“F”][I]
替换为
0


这是因为,在第一种情况下,它只是减法,两个数组或序列可以加/减/乘,输出仍然是一个序列。对于大于或小于的等式,不能这样做。以下是另一种解决方案:

def peak_rate(E, F):
    if E > F:
        return 1
    else:
        return 0

df.loc[:, 'asd'] =  pd.Series([peak_rate(df["E"][i],df["F"][i]) for i in range(len(df))], index=df.index)
或者您甚至不需要函数
peak\u rate
。你可以这样写(我猜你的意思是
E>F
而不是
E>0
中的
peak\u rate
。如果是
E>0
,只需将
df[“F”][I]
替换为
0

该行:

if E > 0:
E
(也称为
df.loc[:,'E']
)是a,并检查它是否大于0

如果大于0,则无法检查整个系列

您可以使用:

if E.all() > 0:
也许你对
'E'
E

这句话感到困惑:

if E > 0:
E
(也称为
df.loc[:,'E']
)是a,并检查它是否大于0

如果大于0,则无法检查整个系列

您可以使用:

if E.all() > 0:
也许你把
'E'
E