首页 > 解决方案 > 系统崩溃可能是什么错误并返回“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_())



        

标签: pythonpandaspyqt5nan

解决方案


来自DataFrame.dropna的熊猫文档:

inplacebool,默认为 False

如果为 True,则在原地执行操作并返回 None。

这意味着该行

self.df = self.df.dropna(subset = [text] , inplace=True)

有效地设置self.dfNone。解决方案是使用

self.df.dropna(subset = [text] , inplace=True)

或者

self.df = self.df.dropna(subset = [text] , inplace=False)

推荐阅读