我在Pandas中使用布尔索引.
问题是为什么声明:
a[(a['some_column']==some_number) & (a['some_other_column']==some_other_number)]
工作正常,而
a[(a['some_column']==some_number) and (a['some_other_column']==some_other_number)]
例:
a=pd.DataFrame({'x':[1,1],'y':[10,20]})
In: a[(a['x']==1)&(a['y']==10)]
Out: x y
0 1 10
In: a[(a['x']==1) and (a['y']==10)]
Out: ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()
解决方法:
当你说
(a['x']==1) and (a['y']==10)
你暗中要求Python将(‘[‘x’] == 1)和(a [‘y’] == 10)转换为布尔值.
NumPy数组(长度大于1)和Pandas对象(如Series)没有布尔值 – 换句话说,它们会引发
ValueError: The truth value of an array is ambiguous. Use a.empty, a.any() or a.all().
当用作布尔值时.那是因为它的unclear when it should be True or False.一些用户可能认为如果他们的长度非零,就像python列表那样是真的.其他人可能希望它只有在其所有元素都是真的时才是真的.如果其中任何元素为True,其他人可能希望它为True.
因为有太多相互矛盾的期望,NumPy和Pandas的设计师拒绝猜测,而是提出了一个ValueError.
相反,您必须通过调用empty(),all()或any()方法来显示,以指示您需要的行为.
但是,在这种情况下,看起来你不想要布尔评估,你想要元素逻辑和.这就是&二元运算符执行:
(a['x']==1) & (a['y']==10)
返回一个布尔数组.
顺便说一下,如alexpmil notes,
括号是强制性的,因为&比==有更高的operator precedence.
没有括号,[‘x’] == 1& a [‘y’] == 10将被评估为[‘x’] ==(1& a [‘y’])== 10,这相当于链式比较(a [‘x ‘] ==(1& a [‘y’]))和((1& a [‘y’])== 10).这是Series和Series形式的表达.
使用和使用两个Series将再次触发与上面相同的ValueError.这就是为什么括号是强制性的.
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。