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