求助:使用Pandas检测CSV缺失/无效值未得到预期结果
求助:Pandas检测CSV缺失/无效值无结果问题
我需要用Pandas读取两个CSV文件(Purchase Behaviour Dataset简称PB Dataset、Transactions Dataset简称TR Dataset),检测其中的空值/缺失值及无效值。这是一项评分作业,我自行编写代码后未检测到任何缺失或无效值,希望得到帮助。
相关说明:
- 任务详情为图片形式
- PB Dataset和TR Dataset为CSV格式文件
我当前的代码如下:
import pandas as pd # 读取Purchase Behaviour CSV文件 pb = pd.read_csv('pb.csv') print("\033[1;37;40m{:^80}\033[0m".format("数据概览 -- Purchase Behaviour Dataset")) print() print(pb.head()) # 查看前5行数据 print() print() # 统计数据集总行数和列数 num_rows = len(pb.index) num_cols = len(pb.columns) # 输出行数和列数 print(f"Purchase Behaviour Dataset 总行数: {num_rows}") print(f"Purchase Behaviour Dataset 总列数: {num_cols}") print("\033[1;33;40m{}\033[0m".format("后续将简称该数据集为 'PB Dataset'")) # 对Transactions Dataset执行相同操作 print() print() print("\033[1;37;40m{:^80}\033[0m".format("数据概览 -- Transactions Dataset")) print() tr = pd.read_csv('tr.csv') print(tr.head()) # 查看前5行数据 print() print() # 统计数据集总行数和列数 num_rows = len(tr.index) num_cols = len(tr.columns) # 输出行数和列数 print(f"Transactions Dataset 总行数: {num_rows}") print(f"Transactions Dataset 总列数: {num_cols}") print("\033[1;33;40m{}\033[0m".format("后续将简称该数据集为 'TR Dataset'")) print() print() print("\033[1;37;40m{:^80}\033[0m".format("数据预处理 -- 查找缺失值")) print() # 查找PB Dataset的缺失值 missing_values = pb.isnull().sum().sum() print('PB Dataset 缺失值数量:', missing_values) # 查找PB Dataset的无效值 bad_values = pb.isin(['', '?', 'NA', 'N/A', 'NaN']).sum().sum() print('PB Dataset 无效值数量:', bad_values) print() # 查找TR Dataset的缺失值 missing_values = tr.isnull().sum().sum() print('TR Dataset 缺失值数量:', missing_values) # 查找TR Dataset的无效值 bad_values = tr.isin(['', '?', 'NA', 'N/A', 'NaN']).sum().sum() print('TR Dataset 无效值数量:', bad_values)
改进建议及优化代码
你的现有代码仅检测了显性空值和部分字符串标记,可能遗漏了隐性无效值(如带空格的空白字符串、数值列异常值),且未逐列定位问题。以下是优化方案:
核心改进点:
- 读取文件时自动解析常见缺失值标记,避免后续重复判断
- 用
info()直观查看每列非空数据量和数据类型 - 逐列统计缺失值,而非仅看全局总和
- 检测数值列的业务异常值(如负数、零值,需结合业务逻辑调整)
- 验证字符串列是否存在未被解析的空白值
优化后代码:
import pandas as pd # 定义所有可能的缺失值标记,包含带空格的空白字符串 na_markers = ['', '?', 'NA', 'N/A', 'NaN', ' ', 'null'] # 读取文件时自动将标记解析为Pandas可识别的NaN pb = pd.read_csv('pb.csv', na_values=na_markers) tr = pd.read_csv('tr.csv', na_values=na_markers) # 1. 查看数据集基本信息(含非空计数、数据类型) print("=== PB Dataset 基本信息 ===") pb.info() print("\n=== TR Dataset 基本信息 ===") tr.info() # 2. 逐列统计缺失值数量,定位具体问题列 print("\n=== PB Dataset 各列缺失值计数 ===") print(pb.isnull().sum()) print("\n=== TR Dataset 各列缺失值计数 ===") print(tr.isnull().sum()) # 3. 检测数值列业务异常值(需根据实际业务场景调整判断规则) def check_numeric_anomalies(df, df_name): numeric_cols = df.select_dtypes(include=['int64', 'float64']).columns for col in numeric_cols: # 检测负数(如果业务场景不允许出现负数) neg_count = (df[col] < 0).sum() if neg_count > 0: print(f"\n{df_name} - {col} 列存在 {neg_count} 个负值异常") # 检测零值(如果业务中该字段不应为0) zero_count = (df[col] == 0).sum() if zero_count > 0: print(f"{df_name} - {col} 列存在 {zero_count} 个零值") check_numeric_anomalies(pb, "PB Dataset") check_numeric_anomalies(tr, "TR Dataset") # 4. 验证字符串列是否存在未被解析的空白值 def check_string_blanks(df, df_name): str_cols = df.select_dtypes(include=['object']).columns for col in str_cols: # 去除首尾空格后检查是否为空 blank_count = (df[col].str.strip() == '').sum() if blank_count > 0: print(f"\n{df_name} - {col} 列存在 {blank_count} 个空白字符串") check_string_blanks(pb, "PB Dataset") check_string_blanks(tr, "TR Dataset")
内容的提问来源于stack exchange,提问作者MonkE
相关产品推荐
相关产品推荐

