为什么会出现ValueError:系列的真值不明确?

时间:2020-04-15 00:22:44

标签: python pandas numpy

我知道以前也曾问过类似的问题,但我一直在努力理解为什么会出现此错误。

我正在使用下面的代码创建一个新列,如果“价格”在上限“ price_h2”和下限“ price_h1”之间,则将该行标记为离群值

df_test['price_outlier'] = np.where( df_test['price_h1'] <= df_test['price'] <= df_test['price_h2'],'normal','outlier')

非常感谢您的帮助!

2 个答案:

答案 0 :(得分:2)

因为numpy数组不支持以下语法: a

您需要使用括号将两个子句分开 (a

df_test['price_outlier'] = np.where((df_test['price_h1'] <= df_test['price']) &\
                                    (df_test['price'] <= df_test['price_h2']), 
                                    'normal', 'outlier')

答案 1 :(得分:1)

这样做的原因是,如果您尝试在多元素布尔系列上广播操作,熊猫会选择抛出一个错误,因为它固有地对行为的模棱两可。

pandas遵循NumPy约定,当您尝试将某些内容转换为bool时会引发错误。这在if语句中或在使用布尔运算时发生:和,或,和非。目前尚不清楚以下代码的结果是什么:

有关此行为的更多信息,请参见the pandas documentation

关于如何使所需的行为起作用;请记住,您可以使用许多不同的数据类型(列表,字典,ndarray等)将一列分配给数据框。因此,可以避免序列比较问题的一种简单方法是使用列表理解。

df_test['price_outlier'] = [a <= b <= c for a, b, c in zip(df_test['price_h1'], df_test['price'], df_test['price_h2'])]