python - 系统崩溃可能是什么错误并返回“NoneType”对象没有属性“isna”
问题描述
我有一个使用 pandas 和 pyqt5 的 python 脚本,其中用户在 qtableWidget 中加载一个 csv 文件并打印包含NaN 值的记录,然后用户可以删除这些记录。为了删除 Nan 值,系统通过 QInputDialog 获取用户输入。
当用户删除 NaN 值并尝试打印系统崩溃的记录并显示以下错误时,会出现问题:
self.display_nan.clicked.connect(lambda: self.print_df_NaN(self.df)) 文件“f:\AIenv\sentiment_analysis\qt_designer\harak_anal_2_mainUI.py.py”,第 189 行,在 print_df_NaN print(self.df[df. isna().any(axis=1)]) AttributeError: 'NoneType' 对象没有属性 'isna'
代码:
from PyQt5 import QtCore, QtGui, QtWidgets
import pandas as pd
from PandasModel import PandasModel
import seaborn as sns
import cufflinks as cf
import plotly
import plotly.offline as py
import plotly.express as px
import plotly.graph_objs as go
from plotly.offline.offline import iplot
from PyQt5.QtWidgets import QInputDialog, QLineEdit
cf.go_offline()
cf.set_config_file(offline=False, world_readable=True)
class Widget(QtWidgets.QWidget):
def __init__(self, parent=None):
QtWidgets.QWidget.__init__(self, parent=None)
self.loadBtn = QtWidgets.QPushButton("Select File", self)
self.loadBtn.clicked.connect(self.loadFile)
self.display_nan = QtWidgets.QPushButton("Display NaN Values", self)
self.display_nan.clicked.connect(lambda: self.print_df_NaN(self.df))
self.gridLayout.addWidget(self.display_nan, 3, 0, 1, 1)
self.drop_nan_value = QtWidgets.QPushButton("drop NaN Values", self)
self.drop_nan_value.clicked.connect(lambda: self.getText())
self.pandasTv = QtWidgets.QTableView(self)
self.verticalLayout.addWidget(self.pandasTv)
def loadFile(self):
fileName, _ = QtWidgets.QFileDialog.getOpenFileName(self, "Open File", "", "CSV Files (*.csv)");
self.pathLE.setText(fileName)
df = pd.read_csv(fileName)
model = PandasModel(df)
self.pandasTv.setModel(model)
self.df = df
def print_df_NaN(self,df):
print(self.df[df.isna().any(axis=1)])
def getText(self):
text, okPressed = QInputDialog.getText(self, "select the column to drop NaN","column name:", QLineEdit.Normal, "")
if okPressed and text != '':
print(text)
self.df = self.df.dropna(subset = [text] , inplace=True)
if __name__ == "__main__":
import sys
app = QtWidgets.QApplication(sys.argv)
w = Widget()
w.show()
sys.exit(app.exec_())
解决方案
来自DataFrame.dropna的熊猫文档:
inplacebool,默认为 False
如果为 True,则在原地执行操作并返回 None。
这意味着该行
self.df = self.df.dropna(subset = [text] , inplace=True)
有效地设置self.df
为None
。解决方案是使用
self.df.dropna(subset = [text] , inplace=True)
或者
self.df = self.df.dropna(subset = [text] , inplace=False)
推荐阅读
- regex - 哪个更好地匹配任何字符,(.|\n|\r) 或 [\s\S]?
- exception - 如何在循环中的迭代中回滚所有插入的记录
- python-3.x - 如何在与 RHEL 相同的 python 3.7 shell 提示符下获取执行的命令历史记录
- mysql - 尝试插入新表时出现 MySQL 错误 1064 (42000)
- angular - 如何绑定 PrimeNG MenuItem 的“禁用”属性?
- nativescript - 像 nativescript 插件一样实现 IRLDocumentScanner CocoaPods
- javascript - Internet连接丢失时PWA黑屏(死机白屏)?
- python - 如何在 Django 中使用 BeautifulSoup?
- angular - 即使在 angular.json 中有正确的路径,Angular 也会显示样式 scss 错误
- javascript - 具有隐藏表单值选项的远程用户地址