序列的真值在调用函数时是不明确的错误

2024-05-13 12:34:03 发布

您现在位置:Python中文网/ 问答频道 /正文

我知道下面的错误

ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or 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 

我可以执行这个函数,但是当我用数据帧调用它时,我得到了上面提到的错误。我按照下面的thread和另一个thread来创建该函数。我在我的if子句中使用&而不是and

不管怎样,当我做以下的时候,我得到了我想要的输出。

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函数中犯了什么错误,有什么想法吗?


Tags: the函数dfreturnif错误threadweek
1条回答
网友
1楼 · 发布于 2024-05-13 12:34:03

那个

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

相关问题 更多 >