【Python谜之BUG论】:5.1更新:groupby()求平均报错,近来最奇怪的bug!Jupyter不显示图片、subplots排版不了、read_csv invalid argument……

本文记录了解决JupyterNotebook中图片显示问题、使用read_csv时遇到的无效参数问题以及groupby函数类型错误的方法。这些问题包括plt.subplots()的使用技巧、Windows路径中的隐藏字符处理和数据预处理技巧。
摘要由CSDN通过智能技术生成

前言:题目仿张仲景《伤寒杂病论》。作者骨骼清奇,运行代码时总能遇到些上网不能一下子搜出来解决方法的bug,于是写下这篇笔记,以娱乐各位。
本文持续更新,以后会遇到什么写什么,之前遇到的一些都忘掉了,实在可惜!
//原标题:JupyterNotebook不显示图片、subplots排版不了、read_csv invalid argument……

1. 添加plt.figure()后Jupyter仍不显示图片、plt.subplots()不能把图片装进去,写了两个plot却合并不了

一个甜点:
pip install 在jupyter上不可用的原因:应该是!pip,参考书写在目录之前就没看到……
这一小节同样属于操作类问题,出现在jupyter新使用者身上,现只展示使用plt.subplots()的情况:

代码:
fig,(ax1,ax2)=plt.subplots(1,2)
ax1.plot(x,y1,marker='o',color='b')
显示:
[<matplotlib.lines.Line2D at 0x15ed20a0f10>] 

"at0x"之后的就是错误原因,不同的字符串对应不同的原因,现在我可知道了这是“白板”的意思……
这个原因其实很乌龙,属于都知道,但不提真不会发现的问题:jupyter是一个单元格一个单元格运行
本人实际的操作:
在这里插入图片描述
相当于在shell里一行一个回车键,代码都“身首异处”了怎么可能运行得出来呢?以往在python小白本里是整体运行,就没注意到这个问题。

一个单元格运行一组代码:

#画一条折线
plt.figure()
plt.plot(x,y1,label='match',marker='o',color='b')
plt.plot(x,y2,label='service',marker='o',color='y')
plt.xlabel('x')
#【相当重要!!】【一定要一起运行,不然不视为一张图】
plt.legend() #贴上图例

结果:
在这里插入图片描述

2. 非encoding、engine能救read_csv() invalid argument问题
直接输入:
dta = pd.read_csv('D:\R\R\data\taobao_data.csv')
报错:
OSError: [Errno 22] Invalid argument: 'D:\\R\\R\\data\taobao_data.csv'

设置encoding=“gbk"等都不行;
把”“改成”\“”/“避免歧义也不行
why?
恶毒的windows为了强制路径从左向右显示加入了”\u202a"字符,人类看不出来,但python读得到,所以会报错。【不想看原因可以直接跳最后一篇参考文章】
原因:\u202a 神奇的控制字符
注意这篇文章中的“尝试三”:惊!\u202a错误,百分之九十都不知道的隐藏在文件路径里的惊天秘密!(干货收藏)
简单解决办法:解决python中出现的不可见字符问题,OSError: [Errno 22] Invalid argument: ‘\u202a**.csv‘
这篇文末最后的代码import os,作者实际运行中发现os函数可以不用,写成这样就可以解决问题了:

csvfilename = r'D:\R\R\data\taobao_data.csv'
csvfilename = csvfilename.strip('\u202a')#除去不可见字符
dta = pd.read_csv(csvfilename, encoding = 'gbk') #encoding不可去除
3.groupby(var).mean() 一直显示类型错误,你想不到的解决方式!

本人分组求某个变量的平均值时,一般写成这样:

data.groupby('分组变量').mean()[‘目标列’]

之前运行一直没问题:
在这里插入图片描述
但是今天我再用这个命令,就疯狂报错:

agg function failed [how->mean,dtype->object]

我和通义千问讨论许久,

‘检查列表中可能的非数值’,

nom = data['satisfaction_level'].apply(lambda x: not isinstance(x, (int, float)))
a=0
for i in nom:
    if i == False:
        a+=1
print(a)
输出结果:
14999 全部通过检验

‘强制变成数值astype’,同样报错
why?
why?
没办法,也许是bot不太聪明,去网上搜,虽然没搜到错误,但是,看到了另一种写法!!

data.groupby('分组变量')[‘目标列’].mean()

于是我试了试这种写法,程序成功运行!
在这里插入图片描述
那么,为什么之前那种写法换了个数据集就不行了呢?
答案在于[]索引顺!序!
将[]置于最后,要求mean对每一列都进行运算,但这其中可能包括非数值列,其实错误报告中有提示,只是不容易理解它的意思:
在这里插入图片描述
这其中提到的变量名,根本就不属于目标列

由此,还有另一个解决方法,加上numeric_only=True:

data.groupby('salary').mean(numeric_only=True)['satisfaction_level']

但显然,交换次序就能解决问题最好。

之前为什么没发现?
因为参考书和我用的数据集恰好是全数值列表……当然没问题。
可恶老登!

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值