最近在看Python GUI编程,在用到PyQt5+Pandas时遇到一些问题。这里把问题和解决方法整理一下。备查。

(好像不能上传附件,内容只好写在下面了。)

在PyQt5中使用Pandas时的几个坑

在PyQt5中使用Pandas时需要的模块库为:qtpandas,版本为1.0.4以上,才支持PyQt5。安装过程不说了,找各种方法安装吧。

安装完成后,为检测是否安装成功,运行qtpands提供的例子:BasicExample.py,过程中暴露出很多问题。

1. 无法从pandas.tslib中加载NaTType

报错模块:EditDialogs.py

模块位置:<安装目录>\Anaconda3\lib\site-packages\qtpandas-1.0.4-py3.7.egg\qtpandas\views

报错语句:from pandas.tslib import NaTType

修复方法:

从网上找到了一种方法,有效。修改报错语句为:from pandas._libs.lib import *

2. 'DataFrame' object has no attribute 'ix'

在解决上面的错误后,运行例子,并显示初始界面,但在加载数据的过程中报错。

错误信息:'DataFrame' object has no attribute 'ix'

报错模块:DataFrameModel.py

模块位置:<安装位置>\Anaconda3\lib\site-packages\qtpandas-1.0.4-py3.7.egg\qtpandas\models

报错语句:凡在对DataFrame的操作中使用了“.ix[row_index, column_index]”或类似操作的,多处。

修复方法:

猜测该错误的原因可以是qtpandas的Pandas新、旧版本之间不兼容,我使用的Pandas版本为1.0.1,已经不支持“ix”了。跟踪发现,此时row_index为整型数据,column_index为字符串数据,所以将所有使用“.ix”的地方修改为“.loc”,问题解决。

3. <class 'ValueError'>

上面问题解决后,继续运行例子,在向DataFrame添加新的列时,列名称填写“d”(应该可以任意),列的数据类型选择“datetime”类型,注意:没有填写默认值,然后在点击“OK”时,报错。

错误信息:Location based indexing can only have [integer, integer slice (START point is INCLUDED, END point is EXCLUDED), listlike of integers, boolean array] types (大意是:基于位置的索引只能有[integer,integer 切片(包括起点,不包括终点),listlike of integers,boolean array]类型)

报错模块:DataFrameModel.py

模块位置:<安装位置>\Anaconda3\lib\site-packages\qtpandas-1.0.4-py3.7.egg\qtpandas\models

报错语句:int(self._dataFrame.iloc[row, col])

修复方法:将出错的语句改为:int(self._dataFrame.loc[row, col]),即使用“loc”替换“iloc”

4. name 'NaTType' is not defined

第1个问题是import语句加载模块库时报错,这个错误则是在运行时报错。

错误信息:name 'NaTType' is not defined

报错模块:EditDialogs.py

模块位置:<安装位置>\Anaconda3\lib\site-packages\qtpandas-1.0.4-py3.7.egg\qtpandas\views

报错语句:if isinstance(defaultValue, NaTType):

修复方法:

问题的原因还是qtpandas的版本1.0.4与pandas的版本(1.0.1)不匹配造成的,具体原因是qtpandas使用的是0.2.0的pandas,而官方文档说明在pandas 0.2.0以后的版本,对于“NaTType”不再支持,应改为type(pandas.NaT)。按这个说法,将上面报错的语句修改为if isinstance(defaultValue, type(pandas.NaT)):,同时在该模块的顶部添加:import pandas。

5. 'DataFrame' object has no attribute 'set_value'

在解决上面的问题后,再运行例子,添加datetime类型的列正常(其他数据类型未测试),添加的列正确显示在界面的“表格”中,同时新添加的列的各行数据被赋予“2000-01-01”的默认值。

此时,双击新添加的列对应的值,“表格”中出现一个SpinBox,方便对日期进行调整。调整后,或不做任何调整,鼠标在其他地方单击,则报这个错误。

错误信息:'DataFrame' object has no attribute 'set_value'

报错模块:DataFrameModel.py

模块位置:\Anaconda3\lib\site-packages\qtpandas-1.0.4-py3.7.egg\qtpandas\models

报错语句:self._dataFrame.set_value(row, col, value)

修复方法:

原因是DataFram类中没有“set_value()”方法。

根据Stack Overflow网站介绍的方法,将出错的语句修改为:self._dataFrame.at[row, col] = value

运行不报错,且结果也正确。

总结

总的感觉是这个版本的qtpandas_1.0.4存在许多问题,而且几乎所有问题都是qtpandas与pandas版本不匹配造成的。不想一一检查qtpandas各个模块的所有语句,只有按上面的思路、方法,发现一个问题,解决一个问题吧。

在PyQt5中使用Pandas时的几个坑的更多相关文章

  1. 在Pycharm中使用Pandas时输出结果中列被省略的解决办法

    在使用pycharm学习pandas的过程中我发现好多时候会发生不能输出所有列的情况,上网搜了一下,发现解决的办法是使用一个输出控制的函数. 在下面的代码中我们只是输出starbucks_store_ ...

  2. 记录在vue中使用jsx时踩过的坑

    使用方法及细节就不一一说了. 1.给input或者textarea绑定value时,出现失效的问题.解决方法:https://github.com/vuejs/babel-plugin-transfo ...

  3. PyQt5中的信号与槽,js 与 Qt 对象之间互相调用

    一.PyQt中的信号与槽 信号(Signal)和槽(Slot)是Qt中的核心机制,用在对象之间互相通信.在Qt中每个QObject对象和PyQt中所有继承自QWidget的控件(这些都是QObject ...

  4. 在php中定义常量时,const与define的区别?

    问]在php中定义常量时,const与define的区别?  [答]使用const使得代码简单易读,const本身就是一个语言结构,而define是一个函数.另外const在编译时要比define快很 ...

  5. AndRodi Strudio中的按钮时件

    AndRodi Studio中的按钮时件注册一定要写在onCraete中 @Override protected void onCreate(Bundle savedInstanceState) { ...

  6. 在MySQL向表中插入中文时,出现:incorrect string value 错误

    在MySQL向表中插入中文时,出现:incorrect string value 错误,是由于字符集不支持中文.解决办法是将字符集改为GBK,或UTF-8.      一.修改数据库的默认字符集   ...

  7. Android Tips: 在给drawable中添加图片资源时,文件名必须全小写

    在给drawable中添加图片资源时,文件名必须全小写

  8. 在查询时将查询条件放入Session中,导出时直接根据qpniRGaFiler取查询条件即可

    在查询时将查询条件放入Session中,导出时直接根据qpniRGaFiler取查询条件即可

  9. 使用ueditor中的setContent() 时经常报innerHtml错误(笔记)

    1)今天遇到个问题,使用ueditor中的setContent() 时经常报innerHtml错误:网上找了下解决方案:发现这个可以用: 不能创建editor之后马上使用ueditor.setCont ...

随机推荐

  1. 腾讯云原生数据库TDSQL-C入选信通院《云原生产品目录》

    近日,中国信通院.云计算开源产业联盟正式对外发布<云原生产品目录>,腾讯云原生数据库TDSQL-C凭借其超强性能.极致效率的弹性伸缩和完善的产品化解决方案体系,成功入围目录. 全球数字经济 ...

  2. HTML及HTTP协议

    web服务的过程: 浏览器发请求 --> HTTP协议 --> 服务端接收请求 --> 服务端返回响应 --> 服务端把HTML文件内容发给浏览器 --> 浏览器渲染页面 ...

  3. 在Linux虚拟机中添加多个固定ip地址

    1.右键点击设置2.点击添加,再点击网络适配器,最后点击完成.3.选择完成后的网络适配器,选择仅主机模式.4.用roott身份登录,用nmtui进行设置 systemctl start Network ...

  4. .netcore 定制化项目开发的思考和实现

    今年年初进了一家新公司,进入之后一边维护老项目一边了解项目流程,为了接下来的项目重做积累点经验. 先说下老项目吧,.net fx 3.5+oracle...... 在实际维护中逐渐发现,老项目有标准版 ...

  5. .NET静态代码织入——肉夹馍(Rougamo) 发布1.1.0

    肉夹馍(https://github.com/inversionhourglass/Rougamo)通过静态代码织入方式实现AOP的组件,其主要特点是在编译时完成AOP代码织入,相比动态代理可以减少应 ...

  6. 英特尔CPU系列

    1.酷睿(Core)系列,主要应用于管理 3D.高级视频和照片编辑,玩复杂游戏,享受高分辨率 4K 显示. 2.奔腾(PenTIum)系列,主要应用于借助功能丰富的处理器,加快便携式 2 合 1 电脑 ...

  7. 抖音web端 s_v_web_id 参数生成分析与实现

    本文所有教程及源码.软件仅为技术研究.不涉及计算机信息系统功能的删除.修改.增加.干扰,更不会影响计算机信息系统的正常运行.不得将代码用于非法用途,如侵立删! 抖音web端 s_v_web_id 参数 ...

  8. 故障案例 | 主从复制环境中tokudb引擎报错排查过程

    欢迎来到 GreatSQL社区分享的MySQL技术文章,如有疑问或想学习的内容,可以在下方评论区留言,看到后会进行解答 GreatSQL社区原创内容未经授权不得随意使用,转载请联系小编并注明来源. 0 ...

  9. Vim基础用法,最常用、最实用的命令介绍(保姆级教程)

    配置文件设置 set number (设置行号) set nocompatible (设置不兼容vi模式,不设置会导致许多vim特性被禁用) set clipboard=unnamed (设置普通的复 ...

  10. 深入Synchronized各种使用方法

    深入学习Synchronized各种使用方法 在Java当中synchronized通常是用来标记一个方法或者代码块.在Java当中被synchronized标记的代码或者方法在同一个时刻只能够有一个 ...