最近在看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各個模塊的所有語句,只有按上面的思路、方法,發現一個問題,解決一個問題吧。