我有一个在 python 中使用 pyqt5 的 GUI 界面,它创建一个窗口,允许用户加载 csv 文件并对其进行处理,打印标题并创建函数,其中一个函数是显示包含 NaN 值的记录。
当我按下此按钮时,系统崩溃并显示以下错误:
AttributeError: 'bool' object has no attribute 'isna'
from PyQt5 import QtCore, QtGui, QtWidgets
class Ui_Form(QtWidgets.QWidget):
def __init__(self, parent=None):
QtWidgets.QWidget.__init__(self, parent=None)
self.setObjectName("Form")
self.setEnabled(True)
self.resize(533, 575)
self.display_nan_values = QtWidgets.QPushButton(self)
self.display_nan_values.setObjectName("display_nan_values")
self.display_nan_values.clicked.connect(self.print_df_NaN)
if __name__ == "__main__":
import sys
app = QtWidgets.QApplication(sys.argv)
ui = Ui_Form()
ui.show()
sys.exit(app.exec_())
def print_df_NaN(self,df):
print(self.df[df.isna().any(axis=1)])
这个函数的错误在哪里?
好像我在它下面写了这个函数,但这不是我想要的。
def print_df_NaN(self,df):
print(self.df.isna())
结果是:
event_type date event_city event_location number_person groups
0 False False False False False False
1 False False False False False False
2 False False False False False False
3 False False False False False False
4 False False False False False False
... ... ... ... ... ... ...
3377 False False False False False False
3378 False False False False False False
3379 False False False False False False
3380 False False False False False False
3381 False False False False False False
基于答案@leminhnguyenHUST我更新了功能:
def print_df_NaN(self,df):
def get_not_nan(self,df):
for col in df.columns:
df = df[~pd.isnull(df[col])]
return df
df1 = get_not_nan(df)
print(df[~df.apply(tuple,1).isin(df1.apply(tuple,1))])
试试这个:
import numpy as np
import pandas as pd
df1 = pd.DataFrame({'movie': ['thg', 'thg', 'mol', 'mol', 'lob', 'lob'],'rating': [3., 4., 5., np.nan, np.nan, np.nan],'name': ['John','James', np.nan, np.nan, np.nan,np.nan]})
def get_nan_rows(df1):
def get_not_nan(df):
for col in df.columns:
df = df[~pd.isnull(df[col])]
return df
df2 = get_not_nan(df1)
return df1[~df1.apply(tuple,1).isin(df2.apply(tuple,1))]
get_nan_rows(df1)
输入:
结果:
另一种方式:
import numpy as np
import pandas as pd
df1 = pd.DataFrame({'movie': ['thg', 'thg', 'mol', 'mol', 'lob', 'lob'],'rating': [3., 4., 5., np.nan, np.nan, np.nan],'name': ['John','James', np.nan, np.nan, np.nan,np.nan]})
mask=df1.isna().apply(lambda x :any(x),axis=1)
df1[mask]
'''