当前位置: 首页 > news >正文

Pandas-数据查看与质量检查

Pandas-数据查看与质量检查

    • 一、数据查看:快速掌握数据概况
      • 1. 整体概览:shape与info()
      • 2. 数值特征预览:describe()
      • 3. 随机抽样:head()与sample()
    • 二、数据质量检查:识别与处理问题
      • 1. 缺失值检查与处理
        • 处理策略:
      • 2. 异常值检测与处理
        • 处理策略:
      • 3. 重复数据检查与处理
      • 4. 数据类型错误处理
    • 三、高级检查:一致性与逻辑性验证
    • 四、实战案例:完整数据质量检查流程

数据分析流程中,拿到数据后的第一步不是急于建模或可视化,而是全面了解数据——包括数据规模、结构、取值分布以及潜在的质量问题。Pandas作为数据处理的利器,提供了一系列简洁高效的工具,帮助我们快速完成数据查看与质量检查。

一、数据查看:快速掌握数据概况

数据查看的核心目标是回答“数据是什么样的”,包括样本量、特征数、数据类型、取值范围等基础信息。Pandas的几个核心函数可以帮我们快速建立对数据的认知。

1. 整体概览:shape与info()

import pandas as pd
import numpy as np# 读取示例数据(假设为某电商用户行为数据)
df = pd.read_csv('user_behavior.csv')# 查看数据规模(行数×列数)
print(f"数据形状:{df.shape}")  # 输出:数据形状:(10000, 8)# 查看详细信息(数据类型、非空值数量)
df.info()

info()的输出包含关键信息:

  • 每列的名称、数据类型(dtype
  • 非空值数量(可快速判断是否存在缺失值)
  • 内存占用(帮助评估数据规模)

例如,若某列dtype显示为object但实际应为日期,或某列非空值远少于总行数,这些都是需要进一步处理的信号。

2. 数值特征预览:describe()

对于数值型列(int/float),describe()函数提供了基本统计量,帮助快速判断数据分布:

# 查看数值列的统计摘要
df.describe()

输出包含:

  • 计数(count)、均值(mean)、标准差(std
  • 最小值(min)、四分位数(25%/50%/75%)、最大值(max

通过这些指标可初步识别异常值(如最大值远大于75%分位数)或分布偏态(如均值远大于中位数)。

3. 随机抽样:head()与sample()

查看前几行或随机样本,直观感受数据内容:

# 查看前5行(默认)
df.head()# 查看后10行
df.tail(10)# 随机抽取5行(避免数据排序导致的偏差)
df.sample(5)

这一步能发现明显的数据错误,例如:

  • 日期列格式混乱(如同时存在2023/1/101-01-2023
  • 分类列存在拼写错误(如"男""男性"同时出现)

二、数据质量检查:识别与处理问题

数据质量直接决定分析结果的可靠性,常见问题包括缺失值、异常值、重复数据和数据类型错误,Pandas提供了针对性的检测与处理工具。

1. 缺失值检查与处理

缺失值是最常见的数据质量问题,需先明确缺失比例和模式:

# 计算每列缺失值数量及比例
missing_count = df.isnull().sum()
missing_ratio = (missing_count / len(df)).round(3)
missing_df = pd.DataFrame({'缺失值数量': missing_count,'缺失比例': missing_ratio
})
print(missing_df[missing_df['缺失值数量'] > 0])  # 只显示有缺失的列
处理策略:
  • 删除:缺失比例极高(如>80%)或对分析无影响的列:

    df = df.drop(columns=['irrelevant_col'])  # 删除整列
    

    缺失行较少时可删除行:

    df = df.dropna(subset=['critical_col'])  # 只删除关键列缺失的行
    
  • 填充:根据列类型选择填充方式:

    # 数值列:用均值/中位数填充(中位数更抗异常值)
    df['amount'] = df['amount'].fillna(df['amount'].median())# 分类列:用众数或特殊值(如"未知")填充
    df['category'] = df['category'].fillna(df['category'].mode()[0])# 日期列:用前后值插值
    df['date'] = df['date'].fillna(method='ffill')  # 向前填充(用上一行值)
    

2. 异常值检测与处理

异常值(离群点)可能扭曲统计结果,需结合业务逻辑判断:

# 方法1:基于标准差(适用于近似正态分布的数据)
def detect_outliers_std(col, n_std=3):mean = col.mean()std = col.std()lower = mean - n_std * stdupper = mean + n_std * stdreturn (col < lower) | (col > upper)# 检测数值列的异常值
numeric_cols = df.select_dtypes(include=['int64', 'float64']).columns
for col in numeric_cols:outliers = detect_outliers_std(df[col])print(f"{col}异常值比例:{outliers.mean():.2%}")# 方法2:基于四分位数(IQR法,适用于偏态分布)
Q1 = df['amount'].quantile(0.25)
Q3 = df['amount'].quantile(0.75)
IQR = Q3 - Q1
lower_bound = Q1 - 1.5 * IQR
upper_bound = Q3 + 1.5 * IQR
outliers_iqr = (df['amount'] < lower_bound) | (df['amount'] > upper_bound)
处理策略:
  • 截断:将异常值限制在合理范围(如用上下边界替换)
    df['amount'] = df['amount'].clip(lower_bound, upper_bound)
    
  • 标记:不删除异常值,而是新增列标记供后续分析
    df['is_outlier'] = outliers_iqr
    

3. 重复数据检查与处理

重复数据可能导致分析结果被高估,需检测并去重:

# 检查重复行数量
duplicate_count = df.duplicated().sum()
print(f"重复行数量:{duplicate_count}")# 查看重复样本
if duplicate_count > 0:print(df[df.duplicated(keep=False)].sort_values(by=df.columns.tolist()))# 删除重复行(保留第一行)
df = df.drop_duplicates(keep='first')

注意:重复行可能是真实数据(如用户重复购买),需结合业务逻辑判断是否去重。

4. 数据类型错误处理

数据类型错误会导致分析函数失效(如对字符串列计算均值),需针对性转换:

# 1. 字符串转日期(关键操作,否则无法按时间分组)
df['order_date'] = pd.to_datetime(df['order_date'], errors='coerce')
# errors='coerce'将无效格式转为NaT(缺失日期)# 2. 数值型字符串转数值(如"100"→100)
df['price'] = pd.to_numeric(df['price'], errors='coerce')# 3. 分类列优化(减少内存占用,便于后续分析)
df['gender'] = df['gender'].astype('category')

三、高级检查:一致性与逻辑性验证

除了基础问题,还需验证数据的业务逻辑性,例如:

  • 订单金额不能为负
  • 开始日期不能晚于结束日期
# 检查金额合理性
invalid_amount = df[df['amount'] < 0]
if not invalid_amount.empty:print(f"发现{len(invalid_amount)}条金额为负的记录")df['amount'] = df['amount'].clip(lower=0)  # 修正为0# 检查日期逻辑
df['start_date'] = pd.to_datetime(df['start_date'])
df['end_date'] = pd.to_datetime(df['end_date'])
invalid_dates = df[df['start_date'] > df['end_date']]
if not invalid_dates.empty:print(f"发现{len(invalid_dates)}条开始日期晚于结束日期的记录")# 交换错误的日期mask = df['start_date'] > df['end_date']df.loc[mask, ['start_date', 'end_date']] = df.loc[mask, ['end_date', 'start_date']].values

四、实战案例:完整数据质量检查流程

def data_quality_check(df):"""数据质量检查与清洗函数"""print("=== 数据概览 ===")print(f"形状:{df.shape}")df.info()print("\n=== 缺失值检查 ===")missing = df.isnull().sum()missing = missing[missing > 0]if not missing.empty:print(missing)# 处理策略:数值列填充中位数,分类列填充众数for col in missing.index:if pd.api.types.is_numeric_dtype(df[col]):df[col] = df[col].fillna(df[col].median())else:df[col] = df[col].fillna(df[col].mode()[0])print("缺失值已处理")else:print("无缺失值")print("\n=== 重复数据检查 ===")duplicates = df.duplicated().sum()if duplicates > 0:df = df.drop_duplicates()print(f"删除{duplicates}条重复行,剩余{len(df)}行")else:print("无重复数据")print("\n=== 异常值检查 ===")numeric_cols = df.select_dtypes(include=['number']).columnsfor col in numeric_cols:Q1 = df[col].quantile(0.25)Q3 = df[col].quantile(0.75)IQR = Q3 - Q1outliers = (df[col] < (Q1 - 1.5 * IQR)) | (df[col] > (Q3 + 1.5 * IQR))if outliers.sum() > 0:print(f"{col}存在{outliers.sum()}个异常值,已截断至合理范围")df[col] = df[col].clip(Q1 - 1.5 * IQR, Q3 + 1.5 * IQR)print("\n=== 数据类型修正 ===")# 自动检测并转换日期列for col in df.columns:if 'date' in col.lower():df[col] = pd.to_datetime(df[col], errors='coerce')print("数据类型已修正")return df# 执行检查与清洗
clean_df = data_quality_check(df)

总结:数据质量检查的核心原则

  1. 全面扫描:结合统计指标与样本查看,不遗漏任何列。
  2. 区别对待:根据列的类型(数值/分类/日期)选择合适的检查方法。
  3. 业务导向:异常值和缺失值的处理需符合业务逻辑,而非机械套用公式。
  4. 可复现性:将检查与清洗步骤封装为函数,确保流程可重复、可追溯。

That’s all, thanks for reading~~
觉得有用就点个赞、收进收藏夹吧!关注我,获取更多干货~

http://www.lryc.cn/news/586009.html

相关文章:

  • 华为 GaussDB :技术特性、应用局限与市场争议
  • TensorFlow2 study notes[2]
  • 【嵌入式硬件实例】-555定时器实现倍压电路
  • 【408考研知识点全面讲解计算机学科专业基础综合(408)】——数据结构之排序
  • 依赖注入的逻辑基于Java语言
  • 【第五节】部署http接口到ubuntu server上的docker内
  • Eplan API Scripts
  • Transforms
  • Spring Boot 整合 OAuth2 详细教程(适用于 2025 年 Spring Boot 3.x)
  • 力扣-19. 删除链表的倒数第N个节点
  • 什么是 Bootloader?怎么把它移植到 STM32 上?
  • 【6.1.3 漫画分布式锁】
  • 线程属性设置全攻略
  • 14. 请谈一下浏览器的强缓存和协商缓存
  • 9.2 埃尔米特矩阵和酉矩阵
  • Pandas 模块之数据的读取
  • arcgis投影后数据显示问题记录
  • 非程序员如何用 AI 提升日常工作效率:以产品经理为例的落地实践指南
  • error while loading shared libraries
  • 小架构step系列12:单元测试
  • [爬虫实战] 多进程/多线程/协程-异步爬取豆瓣Top250
  • Pytest 跳过测试技巧:灵活控制哪些测试该跑、哪些该跳过
  • linux系统mysql性能优化
  • H2在springboot的单元测试中的应用
  • 多 Agent 强化学习实践指南(一):CTDE PPO 在合作捕食者-猎物游戏中的应用详解
  • 引入了模块但没有使用”,会不会被打包进去
  • 【C++小白逆袭】内存管理从崩溃到精通的秘籍
  • c++反射实现
  • 张量数值计算
  • 跨系统开发代码换行符如何解决