You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

求助:使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.27 16:28:09