.isna().sum(axis=0)
时间: 2024-05-31 13:10:08 浏览: 213
这是一个 pandas 库中的 DataFrame 对象的方法,用于计算每列缺失值的数量。其中,isna() 方法用于返回一个与原 DataFrame 相同大小的 Boolean 类型的 DataFrame,其中 True 表示缺失值,False 表示非缺失值。sum(axis=0) 方法用于对每列进行求和,即返回一个 Series 对象,其中每个元素表示对应列的缺失值数量。
相关问题
代码# 决策树分类模型 from sklearn.tree import DecisionTreeClassifier model_dt1 = DecisionTreeClassifier(max_leaf_nodes=16, random_state=123).fit(x_train.drop(['label'], axis=1), x_train['label'])报错ValueError: Input contains NaN, infinity or a value too large for dtype('float32').
这个错误提示意味着你的数据中包含了 NaN 值、无穷值或超出了 float32 类型的范围。你需要检查你的数据集,看看是否有这些问题。你可以使用 Pandas 库中的 isna() 函数找到 NaN 值,使用 NumPy 库中的 isinf() 函数找到无穷值。你可以使用以下代码来处理 NaN 和无穷值:
```python
import numpy as np
import pandas as pd
# 查找 NaN 值
print(df.isna().sum())
# 查找无穷值
print(np.isinf(df).sum())
# 填充 NaN 值
df.fillna(0, inplace=True)
# 替换无穷值
df = df.replace([np.inf, -np.inf], np.nan)
df.fillna(0, inplace=True)
```
同时,你也需要确保你的数据集中所有的列都是数值型的,如果不是,你需要进行数据类型转换。如果你的数据集中包含了无法转换为浮点数的数据,那么你需要先进行数据清洗。
使用PyQt实现实现一个腾讯会议参会情况统计工具。本工具主要完成以下功能: 1.加载按照模板格式编制的学生花名朋表格和腾旭会议考勤表,并显示表格详情: 2.对两个表格的数据进行交叉分析,采用花名册中的姓名逐个匹配考勒表的参会人员名称 (参会人员名称中须包含学生姓名): 3.对花名册中可能存在的重名情况进行检查。如果存在重名给出提示信息; 4.统计未参会学生,并计算参会率,在界面信息区进行显示 5.统计参会学生的参会总时长,并以柱状图显示。
好的,这是一个比较复杂的项目,需要一步一步来实现。以下是我提供的思路和代码:
1. 加载并显示表格详情
首先需要使用PyQt中的QFileDialog组件来打开文件对话框,选择要加载的两个表格文件。然后使用pandas库来读取表格数据,将它们存储在两个pandas DataFrame对象中。
```python
import pandas as pd
from PyQt5.QtWidgets import QFileDialog
class MainWindow(QtWidgets.QMainWindow):
def __init__(self):
super().__init__()
self.init_ui()
def init_ui(self):
# ...
def load_files(self):
# 打开文件对话框选择花名册和考勤表格文件
fname_roster, _ = QFileDialog.getOpenFileName(self, '选择花名册文件', '', 'Excel Files (*.xls *.xlsx)')
fname_attendance, _ = QFileDialog.getOpenFileName(self, '选择考勤表文件', '', 'Excel Files (*.xls *.xlsx)')
# 读取表格数据
self.roster_df = pd.read_excel(fname_roster)
self.attendance_df = pd.read_excel(fname_attendance)
# 显示表格详情
self.roster_model = PandasModel(self.roster_df)
self.roster_table_view.setModel(self.roster_model)
self.attendance_model = PandasModel(self.attendance_df)
self.attendance_table_view.setModel(self.attendance_model)
```
其中,PandasModel类是一个自定义的QAbstractTableModel子类,用于将pandas DataFrame对象显示在Qt界面中的QTableView控件中。具体实现方法可以参考[这篇博客](https://www.cnblogs.com/lsdb/p/11202647.html)。
2. 交叉分析数据
我们可以通过pandas的merge函数来将花名册和考勤表格数据进行交叉分析。具体来说,我们可以先将考勤表格数据中的参会人员名称按照姓名分隔成姓和名两列,然后再将两个表格按照姓名进行合并。最后,我们可以将合并后的表格中参会时间为空的行筛选出来,即为未参会学生。
```python
class MainWindow(QtWidgets.QMainWindow):
def __init__(self):
super().__init__()
self.init_ui()
def init_ui(self):
# ...
def analyze_data(self):
# 将考勤表格数据中的参会人员姓名分隔成姓和名两列
self.attendance_df[['Last Name', 'First Name']] = self.attendance_df['参会人员名称'].str.split(' ', expand=True)
# 将两个表格按照姓名进行合并
self.merged_df = pd.merge(self.roster_df, self.attendance_df, how='left', left_on='姓名', right_on='First Name')
# 筛选出未参会学生
self.absent_df = self.merged_df[self.merged_df['参会时间'].isna()]
# 计算参会率
num_present = len(self.merged_df) - len(self.absent_df)
num_total = len(self.merged_df)
attendance_rate = num_present / num_total
self.attendance_rate_label.setText(f'参会率:{attendance_rate:.2%}')
```
3. 检查重名情况
为了检查花名册中可能存在的重名情况,我们可以使用pandas的duplicated函数来查找重复行。具体来说,我们可以在姓名列上查找是否有重复行,如果有则给出提示信息。
```python
class MainWindow(QtWidgets.QMainWindow):
def __init__(self):
super().__init__()
self.init_ui()
def init_ui(self):
# ...
def check_duplicates(self):
# 检查花名册中是否存在重名情况
duplicates = self.roster_df[self.roster_df.duplicated(subset='姓名', keep=False)]
if len(duplicates) > 0:
QMessageBox.warning(self, '警告', '花名册中存在重名情况!')
```
4. 统计参会总时长
为了统计参会学生的参会总时长,我们可以先将参会时间列转换为datetime类型,然后使用pandas的groupby和sum函数来对参会学生按照姓名进行分组,并计算每个学生的参会总时长。最后,我们可以将结果显示在Qt界面中的柱状图控件中。
```python
class MainWindow(QtWidgets.QMainWindow):
def __init__(self):
super().__init__()
self.init_ui()
def init_ui(self):
# ...
def plot_total_time(self):
# 将参会时间列转换为datetime类型
self.merged_df['参会时间'] = pd.to_datetime(self.merged_df['参会时间'])
# 统计参会学生的参会总时长
total_time_df = self.merged_df.groupby('姓名')['参会时间'].sum().reset_index()
# 显示柱状图
self.total_time_bar.clear()
self.total_time_bar.setTitle('参会总时长')
axis = QtCharts.QBarCategoryAxis()
axis.append([name for name in total_time_df['姓名']])
self.total_time_bar.createDefaultAxes()
self.total_time_bar.setAxisX(axis, self.total_time_bar.series()[0])
y_series = QtCharts.QBarSeries()
for i, time in enumerate(total_time_df['参会时间']):
y_series.append(QtCharts.QBarSet(total_time_df.loc[i, '姓名'], [time.total_seconds() / 3600]))
self.total_time_bar.addSeries(y_series)
```
完整代码如下:
阅读全文