评论

收藏

[python] #yyds干货盘点#令人不悦的Error-TypeError: Cannot perform ‘ro

编程语言 编程语言 发布于:2021-11-16 21:10 | 阅读数:524 | 评论:0

这是我参与11月更文挑战的第6天。
大家好,我是老表,这个系列会记录我在编程中遇到的一些问题和解决方法,将直接以遇到的报错作为标题,这样更能方便其他学习者在浏览器中搜索到问题解决方法,也欢迎大家在评论、留言区多交流,谈谈自己的理解或者问题。
比如令人不悦的--requests.exceptions.ProxyError就是一个很好的示范。
今天在处理一个数据的时候,执行了一行代码,结果出现了大问题!!!
# 简单处理数据,去除推荐热搜和置顶热搜
wb_hot_data.drop(wb_hot_data[wb_hot_data['wb_rank']=='·' | pd.isna(wb_hot_data['wb_rank'])].index)
DSC0000.png
DSC0001.png
看着这一堆报错,我估计代码也很委屈!!!

先直接说怎么解决:
# 简单处理数据,去除推荐热搜和置顶热搜
wb_hot_data.drop(wb_hot_data[(wb_hot_data['wb_rank']=='·') | pd.isna(wb_hot_data['wb_rank'])].index)
也许你没有看出来改了什么,其实就是给wb_hot_data['wb_rank']=='·'加了一个括号。
接下来我们用示例数据说说这个错误是怎么产生的?
pandas as pd
import numpy as np
a=np.array([['a',2,3],['b',5,6],[np.NaN,8,9],['a',4,7]])
df1=pd.DataFrame(a,columns=list('ABC'))
print(df1)
'''
  A  B  C
0  a  2  3
1  b  5  6
2  nan  8  9
3  a  4  7
'''
我想删除A列中值为'a'或者None的行:
1.drop(df1[df1['A']=='a' | pd.isna(df1['A'])].index)
这样写好像没什么毛病,但是运行就是会出现标题中讨厌的错误。
于是谷歌查了下,找到了一篇同错误的文章,评论区有博主提出在表达式两边加上括号即可,是优先级问题。
DSC0002.png
看到这个回答,我悟了,基础不扎实果然是会吃亏的。
1.drop((df1[df1['A']=='a') | pd.isna(df1['A'])].index)
# 加个括号就可以啦
'''
  A   B   C
1   b   5   6
2   nan 8   9
'''
我们会发现这里nan没有被删除?是因为初始化是这个nan已经被自动转换成字符串了,所以无法识别成nan被删除,这个问题我们其他文章再说,大家也可以留言说说自己看法。
补充讲一下另一种情况,当A列为数值类型数据,看看会怎么样?
pandas as pd
import numpy as np
# a=np.array([['a',2,3],['b',5,6],[np.NaN,8,9],['a',4,7]])
a=np.array([[1,2,3],[2,5,6],[np.NaN,8,9],[2,4,7]])
df1=pd.DataFrame(a,columns=list('ABC'))
print(df1)
'''
 A  B  C
0  1.0  2.0  3.0
1  2.0  5.0  6.0
2  NaN  8.0  9.0
3  2.0  4.0  7.0
'''
# 我想删除A列中值为2或者None的行
df1.drop(df1[df1['A']==2 | pd.isna(df1['A'])].index)
'''
A   B   C
1   2.0 5.0 6.0
2   NaN 8.0 9.0
3   2.0 4.0 7.0
'''
这个时候我们发现,没有报错,但是结果明显有问题,这是为什么呢?
这是因为数值类型是可以直接和bool类型数据进行运算,所以没有报错;结果出错是因为按运算符优先级,先进行2 | pd.isna(df1['A']),得出来的都是true(2是一个确定的数,在bool类型为true,true和数值进行比较会转变成1),然后和df1['A']进行==运算,会发现只有第一行的1是满足的(1==ture),所以最后会删除第一行。 DSC0003.png
所以还是运算符优先级问题,还是加上()就可以解决问题啦。
1.drop(df1[(df1['A']==2) | pd.isna(df1['A'])].index)
'''
  A   B   C
0   1.0 2.0 3.0
'''
# 为什么这里可以把nan值删除?大家可以讨论讨论
所以我们今天遇到的这个问题是由运算符优先级引起的 字符串类型数据和bool类型数据不能进行|运算。
最后附上Python运算符优先级和结核性一览表。
DSC0004.png
参考
[1] stackoverflow相关问题解答
https://stackoverflow.com/questions/20333435/pandas-comparison-raises-typeerror-cannot-compare-a-dtyped-float64-array-with
[2] Python运算符优先级和结核性一览表
http://c.biancheng.net/view/2190.html
下期见,我是爱猫爱技术的老表,如果觉得本文对你学习有所帮助,欢迎点赞、评论、关注我!
</div>
    
    <div id="asideoffset"></div>

关注下面的标签,发现更多相似文章