我知道以下错误
很久以前就被问过了。ValueError:系列的真值是不明确的。使用a.empty,a.bool(),a.item(),a.any()或a.all()。
但是,我正在尝试创建一个基本函数,并返回一个df['busy']
与1
或0
的新列。我的功能看起来像这样,
def hour_bus(df):
if df[(df['hour'] >= '14:00:00') & (df['hour'] <= '23:00:00')&\
(df['week_day'] != 'Saturday') & (df['week_day'] != 'Sunday')]:
return df['busy'] == 1
else:
return df['busy'] == 0
我可以执行该函数,但是当我用DataFrame调用它时,我得到上面提到的错误。我按照以下thread和另一个thread来创建该函数。我在&
子句中使用了and
而不是if
。
无论如何,当我执行以下操作时,我会获得所需的输出。
df['busy'] = np.where((df['hour'] >= '14:00:00') & (df['hour'] <= '23:00:00') & \
(df['week_day'] != 'Saturday') & (df['week_day'] != 'Sunday'),'1','0')
关于我在hour_bus
函数中犯了什么错误的任何想法?
答案 0 :(得分:3)
在
(df['hour'] >= '14:00:00') & (df['hour'] <= '23:00:00')& (df['week_day'] != 'Saturday') & (df['week_day'] != 'Sunday')
给出一个布尔数组,当你用df
索引时,你将获得df
的一个(可能)较小的部分。
只是为了说明我的意思:
import pandas as pd
df = pd.DataFrame({'a': [1,2,3,4]})
mask = df['a'] > 2
print(mask)
# 0 False
# 1 False
# 2 True
# 3 True
# Name: a, dtype: bool
indexed_df = df[mask]
print(indexed_df)
# a
# 2 3
# 3 4
但它仍然是DataFrame
,因此将其用作需要真值的表达式(在您的情况下为if
)是不明确的。
bool(indexed_df)
# ValueError: The truth value of a DataFrame is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().
您可以使用您使用的np.where
- 或等效地:
def hour_bus(df):
mask = (df['hour'] >= '14:00:00') & (df['hour'] <= '23:00:00')& (df['week_day'] != 'Saturday') & (df['week_day'] != 'Sunday')
res = df['busy'] == 0
res[mask] = (df['busy'] == 1)[mask] # replace the values where the mask is True
return res
然而,np.where
将是更好的解决方案(它更具可读性,可能更快)。