如何使用带有数据帧的python创建函数以在动态列名称上删除NaN值?

问题描述

我想创建删除NaN值的函数,但我需要此函数是动态的,这意味着最终用户可以选择所需的列名而不是预先选择的列。

标题名称:

['event_type','date','event_city','event_mouhafaza','number_person','groups']

这是功能:

def drop_nan(self,df):
        df.dropna(subset = ["number_person"],inplace=True)

我需要允许用户将 number_person 标头的名称更改为上述列表项之一。

下面的代码显示了如何显示带有复选框的标题列表,以便允许用户检查他想要的内容。

系统崩溃并显示以下错误:

self.drop_nan_value.clicked.connect(lambda: self.drop_nan(self.df,self.colname)) AttributeError: 'Widget' object

没有属性“ colname”

enter image description here

代码:

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
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.gridLayout_3 = QtWidgets.QGridLayout(self)
        self.gridLayout_3.setObjectName("gridLayout_3")
       
        self.gridLayout_2 = QtWidgets.QGridLayout()
        self.gridLayout_2.setObjectName("gridLayout_2")
       
        self.gridLayout = QtWidgets.QGridLayout()
        self.gridLayout.setObjectName("gridLayout")
        
        self.pathLE = QtWidgets.QLineEdit(self)
        self.gridLayout_2.addWidget(self.pathLE,1,1)
        

        
        self.loadBtn = QtWidgets.QPushButton("Select File",self)
        self.loadBtn.clicked.connect(self.loadFile)
        self.gridLayout_2.addWidget(self.loadBtn,1)
        self.gridLayout_3.addLayout(self.gridLayout_2,4)

       
        self.displayHeader = QtWidgets.QPushButton("Display header",self)
        self.displayHeader.clicked.connect(lambda: self.print_df_header(self.df))
        self.gridLayout.addWidget(self.displayHeader,2,1)
        
        self.displayDF_checked_header = QtWidgets.QPushButton("Print checked item",self)
        self.displayDF_checked_header.clicked.connect(lambda: self.setItems(self.df))
        self.gridLayout.addWidget(self.displayDF_checked_header,5,1)

        self.drop_nan_value = QtWidgets.QPushButton("drop  NaN Values",self)
        self.drop_nan_value.clicked.connect(lambda: self.drop_nan(self.df,self.colname))
        self.gridLayout.addWidget(self.drop_nan_value,4,1)
        self.gridLayout_2.addLayout(self.gridLayout,1)   

        
        self.header_list = QtWidgets.QListWidget(self)
        self.header_list.setObjectName("listWidget")
        self.header_list.itemSelectionChanged.connect(self.selectionChanged)
        self.gridLayout_3.addWidget(self.header_list,1)
   

        self.pandasTv = QtWidgets.QTableView(self)
        self.verticalLayout.addWidget(self.pandasTv)

        self.pandasTv.setSortingEnabled(True)


     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_header(self,df):
        savelist = list(self.df)
        for item in savelist:
            qitem = QtWidgets.QListWidgetItem ( ) 
            qitem.setText ( item ) 
            qitem.setCheckState ( QtCore.Qt.Unchecked ) 
            self.header_list.addItem ( qitem )
        print(savelist)

     def selectionChanged(self):
     checked = []
     for row in range(self.header_list.count()):
        item = self.header_list.item(row)
        if item.checkState():
            checked.append(item)
     print("Checked items: ",",".join(i.text() for i in checked))

     def drop_nan(self,df,colname):
        df.dropna(subset = [colname],inplace=True)


if __name__ == "__main__":
    import sys
    app = QtWidgets.QApplication(sys.argv)
    w = Widget()
    w.show()
    sys.exit(app.exec_())  

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)