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.pswp.cn/pingmian/88536.shtml
繁体地址,请注明出处:http://hk.pswp.cn/pingmian/88536.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

类和对象拓展——日期类

一.前言通过前面对类和对象的学习&#xff0c;现在我们可以开始实践日期类的代码编写。在实际操作过程中&#xff0c;我会补充之前文章中未提及的相关知识点。二.正文 1. 日期类代码实现我们先来看看要实现什么功能吧&#xff0c;把他放在Date.h中#pragma once #include<ios…

大模型KV缓存量化误差补偿机制:提升推理效率的关键技术

大模型KV缓存量化误差补偿机制&#xff1a;提升推理效率的关键技术摘要 随着大型语言模型&#xff08;LLM&#xff09;参数规模突破千亿级别&#xff0c;推理过程中的显存占用与计算延迟成为制约其实际部署的核心瓶颈。KV缓存&#xff08;Key-Value Cache&#xff09;作为Trans…

QT跨平台应用程序开发框架(6)—— 常用显示类控件

目录 一&#xff0c;Label 1.1 主要属性 1.2 文本格式 1.3 设置图片 1.4 其它常用属性 1.5 设置伙伴 二&#xff0c;LCD Number 2.1 主要属性 2.2 实现倒计时 ​2.3 两个问题 三&#xff0c;ProgressBar 3.1 主要属性 3.2 进度条按时间增长 3.3 改变样式 3.4 一个问题 四&#…

LINUX文件系统权限,命令解释器alias,文件查看和查找

1、文件査看:查看/etc/passwd文件的第5行[rootserver ~]# head -5 /etc/passwd | tail -1 #先找到前5行&#xff0c;用管道符过滤&#xff0c;显示倒数第一行2、文件查找(1)在当前目录及子目录中&#xff0c;查找大写字母开头的txt文件[rootserver ~]# find / -name "[…

AI图像修复工具CodeFormer实测:马赛克去除与画质增强效果评测

大家好&#xff01;平时看图片或视频&#xff0c;是不是特别烦人脸被马赛克遮住的地方&#xff1f;比如老照片模糊、视频关键部分被打码&#xff0c;看着很不舒服。今天给大家分享一款超好用的去马赛克神器——CodeFormer&#xff0c;完全免费&#xff0c;新手也能轻松搞定&…

知识宇宙-思考篇:AI大模型如何重塑软件开发流程?

名人说&#xff1a;博观而约取&#xff0c;厚积而薄发。——苏轼《稼说送张琥》 创作者&#xff1a;Code_流苏(CSDN)&#xff08;一个喜欢古诗词和编程的Coder&#x1f60a;&#xff09; 目录AI大模型重塑软件开发&#xff1a;从码农到AI编程伙伴的华丽转身一、AI大模型的编程&…

Rocky Linux上使用NVM安装Node.js 18

问题描述 Rocky Linux 9 默认 yum 安装的 Node.js 版本是16&#xff0c;vite启动报错&#xff1a;TypeError: crypto$2.getRandomValues is not a function &#xff0c;需安装更高版本的 Node.js 使用nvm安装Node.js的好处 多版本管理&#xff0c;NVM 允许你安装多个不同版本的…

JVM 中“对象存活判定方法”全面解析

1. 前言 在 Java 开发过程中&#xff0c;我们常常听到“垃圾回收”&#xff08;Garbage Collection, GC&#xff09;这一术语。JVM 通过垃圾回收机制自动管理内存&#xff0c;极大地简化了程序员的内存控制负担。然而&#xff0c;GC 究竟是如何判断哪些对象该回收、哪些应保留…

苹果公司高ROE分析

公司通过增加负债提升净资产收益率&#xff08;ROE&#xff09;的核心机制在于财务杠杆效应和资本结构优化&#xff0c;以下从原理、操作路径、风险边界及苹果案例四维度展开分析&#xff1a;名称解释&#xff1a; ROIC(投入资本回报率)&#xff1a;ROICNOPATInvested Capital …

【Linux系统】进程概念

1. 进程概念1.1 进程的本质核心定义用户视角&#xff1a;程序的动态执行实例&#xff08;如同时运行多个Chrome窗口即多个进程&#xff09;。内核视角&#xff1a;资源分配的最小实体单位&#xff0c;独享CPU时间片、内存空间和文件资源。现代定义&#xff1a;进程 内核数据结…

从LLM到VLM:视觉语言模型的核心技术与Python实现

本教程的完整代码可以在GitHub上找到&#xff0c;如果你有任何问题或建议&#xff0c;欢迎交流讨论。 引言&#xff1a;为什么需要VLM&#xff1f; 当我们与ChatGPT对话时&#xff0c;它能够理解复杂的文字描述&#xff0c;生成流畅的回答。但如果我们给它一张图片&#xff0c…

老系统改造增加初始化,自动化数据源配置(tomcat+jsp+springmvc)

老系统改造增加初始化&#xff0c;自动化数据源配置一、前言二、改造描述1、环境说明2、实现步骤简要思考三、开始改造1、准备sql初始化文件2、启动时自动读取jdbc文件&#xff0c;创建数据源&#xff0c;如未配置&#xff0c;需要一个默认的临时数据源2.1去掉sping mvc原本配置…

卫星通信终端天线的5种对星模式之二:DVB跟踪

要实现稳定可靠的卫星通信&#xff0c;地面终端天线必须精准地对准远方的卫星。对星的过程是一个不断搜索、不断逼近的过程&#xff0c;其目标是让天线波束中心精确指向卫星&#xff0c;从而获得最大信号接收与发射效率。 卫星通信终端天线的对星技术是保障卫星通信链路稳定的…

重构下一代智能电池“神经中枢”:GCKontrol定义高性能BMS系统级设计标杆

概述BMS&#xff08;电池管理系统&#xff09;作为新能源汽车动力电池与整车的核心纽带&#xff0c;通过实时监控电压、电流、温度及SOC等参数&#xff0c;控制电池充放电过程&#xff0c;保障电池安全性与使用寿命。随着电动汽车智能化发展&#xff0c;对BMS的响应速度、精度和…

面试150 对称二叉树

思路 联想递归三部曲&#xff1a;传入参数、遍历方式、返回什么。本题联想到先序遍历的方式,需要遍历整颗二叉树,最后返回的是一个布尔值。然后我们需要传入的是左子树和左子树的节点,然后分别进行比较。 # Definition for a binary tree node. # class TreeNode: # def __…

多线程的区别和联系

进程和线程的区别和联系1.一个进程可以包含多个线程&#xff0c;不能够没有线程2.进程是系统资源分配的基本单位&#xff0c;线程是系统调度执行的基本单位3.同一个进程里的线程之间&#xff0c;共用同一份系统资源4.线程是当下实现并发编程的主流方式&#xff0c;通过多线程&a…

两个文件夹自动同步

两个文件夹自动同步&#xff0c;非常简单&#xff0c;利用一些工具就可以轻松做到&#xff0c;设置完源和目标文件夹&#xff0c;点击启动就马上可以两个文件夹自动同步&#xff0c;对于一些有文件同步、文件灾备需求的老登&#xff0c;用起来会非常顺手&#xff0c;比如PanguF…

虚拟商品交易维权指南:数字经济时代的消费者权益保护

首席数据官高鹏律师数字经济团队创作AI辅助在元宇宙、NFT、虚拟情绪产品等新兴领域蓬勃发展的今天&#xff0c;虚拟商品交易已成为数字经济的重要组成部分。从游戏皮肤、在线课程到数字藏品&#xff0c;消费者在享受虚拟商品便捷性的同时&#xff0c;也面临着诸多法律风险。作为…

mysql 一条语句的执行流程

文章目录一条查询语句的执行流程连接器管理连接权限校验分析器优化器采样统计优化器选错索引改正执行器查询缓存存储引擎一条update语句的执行流程redo logredo log buffer结构redo log日志类型写入时机配置innodb_flush_log_at_trx_commitbinlogredo log和binlog 对比配置两阶…

【视频观看系统】- 需求分析

&#x1f3af; 一、项目目标 构建一个功能完备的视频观看网站&#xff0c;用户可以上传、浏览、观看视频&#xff0c;并在观看过程中实时发送/接收弹幕。系统具备良好的性能、可扩展性与用户体验&#xff0c;未来可逐步扩展为多媒体平台。&#x1f464; 二、用户角色分析用户类…