系列的真值是不明确的 - 调用函数时出错

时间:2017-07-17 15:32:50

标签: python pandas if-statement dataframe

我知道以下错误

  

ValueError:系列的真值是不明确的。使用a.empty,a.bool(),a.item(),a.any()或a.all()。

很久以前就被问过了。

但是,我正在尝试创建一个基本函数,并返回一个df['busy']10的新列。我的功能看起来像这样,

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函数中犯了什么错误的任何想法?

1 个答案:

答案 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将是更好的解决方案(它更具可读性,可能更快)。