pandas在数据清洗中的实际应用

news2024/10/18 23:11:25

使用 pandas 进行数据清洗

一、引言

在当今数据驱动的时代,数据已成为企业和研究机构做出明智决策的核心要素。然而,原始数据往往充满了噪音、缺失值、重复值和异常值等问题。如果不对这些问题进行处理,可能会导致分析结果的偏差,甚至得出错误的结论。因此,数据清洗(Data Cleaning)作为数据分析流程中的关键步骤,显得尤为重要。

数据清洗的重要性

  • 提高数据质量:高质量的数据是可靠分析的基础。数据清洗能够纠正或删除不准确的数据,从而提高数据集的整体质量。
  • 减少偏差和错误:通过处理缺失值和异常值,数据清洗可以减少模型训练中的偏差,避免因数据问题导致的错误结果。
  • 优化模型性能:清洗后的数据更能准确反映实际情况,帮助机器学习模型获得更好的性能和泛化能力。
  • 节省时间和资源:尽早发现并处理数据问题,可以避免在后续分析和建模过程中花费更多的时间来纠正错误。

pandas 在数据清洗中的优势

在众多数据处理工具中,pandas 脱颖而出,成为 Python 生态中处理结构化数据的首选库。它的优势主要体现在:

  • 丰富的数据结构:pandas 提供了 Series 和 DataFrame 两种核心数据结构,能够方便地处理一维和二维数据。
  • 强大的数据处理功能:内置了大量函数和方法,用于数据读取、过滤、变换和聚合等操作,满足各种数据清洗需求。
  • 高效的缺失值处理:提供了灵活的缺失值检测、填充和删除方法,帮助快速处理数据中的空值。
  • 便捷的数据类型转换:支持对数据类型进行灵活的转换和格式化,方便统一数据格式。
  • 易于与其他库集成:可以与 NumPy、Matplotlib、scikit-learn 等库无缝集成,构建完整的数据分析和机器学习流程。

本博客的目的

本博客旨在详细介绍如何使用 pandas 库进行数据清洗。通过实际的代码示例,逐步演示从数据读取、缺失值处理、重复值删除、数据类型转换、异常值处理到数据标准化的完整流程。希望读者在阅读后能够:

  • 掌握 pandas 处理数据清洗的基本方法和技巧
  • 理解数据清洗在数据分析和建模中的重要作用
  • 能够在实际项目中应用所学知识,提高数据处理的效率和效果

接下来,我们将从 pandas 库的简介开始,逐步深入数据清洗的各个环节。


二、pandas 库简介

安装与导入

在开始使用 pandas 之前,需要确保已安装该库。如果尚未安装,可以使用以下命令进行安装:

pip install pandas

导入 pandas 库通常使用别名 pd

import pandas as pd

核心数据结构

Series

Series 是一种类似于一维数组的对象,由一组数据和一组与之相关的索引组成。

import pandas as pd

# 创建一个 Series
s = pd.Series([1, 3, 5, 7, 9])
print(s)

输出:

0    1
1    3
2    5
3    7
4    9
dtype: int64
DataFrame

DataFrame 是一种二维的表格型数据结构,包含有行索引和列标签。

import pandas as pd

# 创建一个 DataFrame
data = {
    'Name': ['Alice', 'Bob', 'Charlie'],
    'Age': [25, 30, 35],
    'City': ['New York', 'Los Angeles', 'Chicago']
}
df = pd.DataFrame(data)
print(df)

输出:

      Name  Age         City
0    Alice   25     New York
1      Bob   30  Los Angeles
2  Charlie   35      Chicago

三、数据读取与初步了解

数据读取

pandas 支持从多种文件格式读取数据,包括 CSV、Excel、JSON 等。

import pandas as pd

# 读取 CSV 文件
df_csv = pd.read_csv('data.csv')

# 读取 Excel 文件
df_excel = pd.read_excel('data.xlsx')

# 读取 JSON 文件
df_json = pd.read_json('data.json')

数据概览

读取数据后,通常需要对数据进行初步了解。

# 查看前五行数据
print(df.head())

# 查看后五行数据
print(df.tail())

# 获取数据的基本信息
print(df.info())

# 获取描述性统计信息
print(df.describe())

四、处理缺失值

检测缺失值

# 检测数据中的缺失值
missing_values = df.isnull()
print(missing_values)

# 统计每列缺失值的数量
missing_counts = df.isnull().sum()
print(missing_counts)

删除缺失值

# 删除包含任何缺失值的行
df_dropped_rows = df.dropna()

# 删除完全是缺失值的列
df_dropped_cols = df.dropna(axis=1, how='all')

填充缺失值

# 使用特定值填充缺失值
df_filled = df.fillna(0)

# 使用均值填充
df['Age'] = df['Age'].fillna(df['Age'].mean())

# 前向填充
df['City'] = df['City'].fillna(method='ffill')

# 后向填充
df['City'] = df['City'].fillna(method='bfill')

五、处理重复数据

检测重复值

# 检测重复行
duplicates = df.duplicated()
print(duplicates)

删除重复值

# 删除重复行,保留第一次出现的
df_no_duplicates = df.drop_duplicates()

# 删除重复行,保留最后一次出现的
df_no_duplicates = df.drop_duplicates(keep='last')

六、数据类型转换

检查数据类型

# 查看数据类型
print(df.dtypes)

转换数据类型

# 将字符串转换为数值类型
df['Age'] = df['Age'].astype(int)

# 将数据类型转换为类别类型
df['City'] = df['City'].astype('category')

处理日期时间数据

# 将字符串转换为日期时间类型
df['Date'] = pd.to_datetime(df['Date'])

# 提取年份、月份和日期
df['Year'] = df['Date'].dt.year
df['Month'] = df['Date'].dt.month
df['Day'] = df['Date'].dt.day

七、处理异常值

检测异常值

import numpy as np

# 使用箱线图统计值检测异常值
Q1 = df['Age'].quantile(0.25)
Q3 = df['Age'].quantile(0.75)
IQR = Q3 - Q1
lower_bound = Q1 - 1.5 * IQR
upper_bound = Q3 + 1.5 * IQR

# 找出异常值
outliers = df[(df['Age'] < lower_bound) | (df['Age'] > upper_bound)]
print(outliers)

处理异常值

# 删除异常值
df = df[(df['Age'] >= lower_bound) & (df['Age'] <= upper_bound)]

# 将异常值替换为上下限
df['Age'] = np.where(df['Age'] > upper_bound, upper_bound, df['Age'])
df['Age'] = np.where(df['Age'] < lower_bound, lower_bound, df['Age'])

八、数据标准化与规范化

标准化

from sklearn.preprocessing import StandardScaler

scaler = StandardScaler()
df['Age_scaled'] = scaler.fit_transform(df[['Age']])

规范化

from sklearn.preprocessing import MinMaxScaler

min_max_scaler = MinMaxScaler()
df['Age_normalized'] = min_max_scaler.fit_transform(df[['Age']])

九、字符串数据处理

字符串操作方法

# 转换为小写
df['City'] = df['City'].str.lower()

# 去除空格
df['Name'] = df['Name'].str.strip()

分割与替换

# 分割字符串
df[['First_Name', 'Last_Name']] = df['Name'].str.split(' ', expand=True)

# 替换字符串
df['City'] = df['City'].str.replace('new york', 'NYC')

正则表达式的应用

# 提取符合特定模式的字符串
df['Email_Domain'] = df['Email'].str.extract(r'@([\w\.]+)')

# 判断字符串是否匹配特定模式
df['Is_Gmail'] = df['Email'].str.contains(r'@gmail\.com')

十、数据的合并与连接

合并数据

# 创建两个数据集
df1 = pd.DataFrame({'ID': [1, 2, 3], 'Name': ['Alice', 'Bob', 'Charlie']})
df2 = pd.DataFrame({'ID': [1, 2, 4], 'Age': [25, 30, 40]})

# 合并数据集
df_merged = pd.merge(df1, df2, on='ID', how='inner')
print(df_merged)

输出:

   ID     Name  Age
0   1    Alice   25
1   2      Bob   30

连接数据

# 纵向连接
df_concat = pd.concat([df1, df2], axis=0, ignore_index=True)
print(df_concat)

输出:

    ID     Name   Age
0  1.0    Alice   NaN
1  2.0      Bob   NaN
2  3.0  Charlie   NaN
3  1.0      NaN  25.0
4  2.0      NaN  30.0
5  4.0      NaN  40.0

十一、案例实战

选择真实数据集

我们以 泰坦尼克号乘客数据集 为例,演示完整的数据清洗流程。该数据集可从 Kaggle 获取,包含了泰坦尼克号上乘客的各种信息,如年龄、性别、船票价格等。

import pandas as pd

# 读取数据集
df = pd.read_csv('titanic.csv')

# 查看数据基本信息
print(df.info())

完整的数据清洗流程

1. 处理缺失值
# 填充 'Age' 列的缺失值为均值
df['Age'].fillna(df['Age'].mean(), inplace=True)

# 填充 'Embarked' 列的缺失值为众数
df['Embarked'].fillna(df['Embarked'].mode()[0], inplace=True)
2. 转换数据类型
# 将 'Survived' 列转换为整数类型
df['Survived'] = df['Survived'].astype(int)
3. 处理异常值
import numpy as np

# 使用箱线图方法处理 'Fare' 列的异常值
Q1 = df['Fare'].quantile(0.25)
Q3 = df['Fare'].quantile(0.75)
IQR = Q3 - Q1
fare_lower = Q1 - 1.5 * IQR
fare_upper = Q3 + 1.5 * IQR
df['Fare'] = np.where(df['Fare'] > fare_upper, fare_upper, df['Fare'])
df['Fare'] = np.where(df['Fare'] < fare_lower, fare_lower, df['Fare'])
4. 特征工程
# 创建家庭人数特征
df['FamilySize'] = df['SibSp'] + df['Parch'] + 1
5. 编码分类变量
# 对 'Sex' 和 'Embarked' 列进行独热编码
df = pd.get_dummies(df, columns=['Sex', 'Embarked'])
6. 删除不必要的列
# 删除对模型无用的列
df.drop(['PassengerId', 'Name', 'Ticket', 'Cabin'], axis=1, inplace=True)
7. 查看清洗后的数据集
print(df.head())

输出:

   Survived  Pclass        Age     Fare  SibSp  Parch  FamilySize  Sex_female  \
0         0       3  22.000000   7.2500      1      0           2           0   
1         1       1  38.000000  71.2833      1      0           2           1   
2         1       3  29.699118   7.9250      0      0           1           1   
3         1       1  35.000000  53.1000      1      0           2           1   
4         0       3  35.000000   8.0500      0      0           1           0   

   Sex_male  Embarked_C  Embarked_Q  Embarked_S  
0         1           0           0           1  
1         0           1           0           0  
2         0           0           0           1  
3         0           0           0           1  
4         1           0           0           1  

代码示例与解释

在上述代码中,我们完成了以下步骤:

  • 填充缺失值:处理了 AgeEmbarked 列的缺失值。
  • 数据类型转换:将 Survived 列转换为了整数类型。
  • 处理异常值:使用箱线图方法对 Fare 列的异常值进行了处理。
  • 特征工程:创建了新的特征 FamilySize,表示乘客的家庭人数。
  • 编码分类变量:对 SexEmbarked 列进行了独热编码,方便后续的模型训练。
  • 数据清理:删除了对分析无关的列,如 PassengerIdNameTicketCabin

十二、总结与展望

在本博客中,我们详细介绍了如何使用 pandas 进行数据清洗。从数据读取、缺失值处理、重复值删除、数据类型转换、异常值处理,到数据标准化和字符串处理,我们涵盖了数据清洗的主要步骤和方法。

关键要点:

  • 数据清洗的重要性:确保数据质量,提高分析和模型的可靠性。
  • pandas 的强大功能:提供了丰富的方法和函数,能够高效地完成各种数据清洗任务。
  • 实际应用:通过泰坦尼克号数据集的实战案例,展示了数据清洗在真实项目中的应用。

进一步学习的方向:

  • 数据可视化:使用 Matplotlib、Seaborn 等库对数据进行可视化分析。
  • 高级数据分析:深入研究数据的统计特征,进行探索性数据分析(EDA)。
  • 机器学习建模:使用清洗后的数据进行模型训练和评估。

十三、参考资料

  • 官方文档
    • pandas 官方文档
  • 相关书籍与教程
    • 《利用 Python 进行数据分析》作者:Wes McKinney
  • 在线资源
    • Kaggle 泰坦尼克号数据集
    • Python 数据科学手册

希望本博客能帮助您深入理解数据清洗的重要性和 pandas 的强大功能。欢迎在下方留言分享您的想法和问题,共同进步!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2218080.html

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

相关文章

牛客习题—线性DP 【mari和shiny】C++

你好&#xff0c;欢迎阅读我的文章~ 个人主页&#xff1a;Mike 所属专栏&#xff1a;动态规划 mari和shiny mari和shiny ​ 分析: 使用动态规划的思路来解决。 思路&#xff1a; 分别统计s&#xff0c;sh&#xff0c;shy的数量即可。使用ss来统计字符s的数量&#xff0c;使…

LC1523.在区间范围内统计奇数数目

一开始没审题&#xff0c;居然构造了一个数组去做… 然后重新看&#xff0c;首先先想到的暴力解就是遍历low到high&#xff0c;然后每一个数都对二取余。但是这样的暴力解就没什么锻炼 那肯定再想一个思路&#xff0c;Low和high都有两种情况&#xff0c;要么是奇数&#xff0c…

30.第二阶段x86游戏实战2-遍历周围-C++遍历二叉树(玩家角色基址)

免责声明&#xff1a;内容仅供学习参考&#xff0c;请合法利用知识&#xff0c;禁止进行违法犯罪活动&#xff01; 本次游戏没法给 内容参考于&#xff1a;微尘网络安全 本人写的内容纯属胡编乱造&#xff0c;全都是合成造假&#xff0c;仅仅只是为了娱乐&#xff0c;请不要…

衡石分析平台系统分析人员手册-应用查看

应用查看​ 应用创作界面展示了用户可以查看的所有应用。 用户可以使用平铺视图或列表视图查看应用。同时支持通过搜索、过滤、排序等方式快速查找应用。 应用视图​ 应用创作支持平铺视图和列表视图两种展示方式&#xff0c;默认以平铺视图的方式展示应用&#xff0c;用户可…

2024 蚂蚁SEO蜘蛛池对网站收录的帮助

《2024 蜘蛛池对网站收录还有效果吗&#xff1f;》 在网站优化的领域中&#xff0c;蜘蛛池曾经是一个备受关注的工具。然而&#xff0c;随着搜索引擎算法的不断演进&#xff0c;人们对于 2024 年蜘蛛池对网站收录是否还有效果产生了疑问。 一、什么是蜘蛛池&#xff1f; 蜘蛛池…

APQP在制造行业的应用:搭上数字化项目管理平台很nice

APQP&#xff08;Advanced Product Quality Planning&#xff0c;即产品质量先期策划&#xff09;最早由汽车行业引入&#xff0c;并因其在质量管理方面的显著效果而逐渐被其他制造业领域所采纳。 APQP提供了一种从产品设计的最初阶段到生产过程的全面质量管理框架&#xff0c;…

使用fpm工具制作Vim.rpm包

背景&#xff1a;生产环境中的CentOS 7在安全扫描中被扫描出vim存在堆缓冲区溢出&#xff08;CVE-2024-45306&#xff09;等漏洞。根据漏洞说明&#xff0c;需要升级到最新版。 奈何CentOS 7已经停止维护了&#xff0c;所以&#xff0c;想在网上找一个最新版的vim.rpm相当不容易…

数字图像处理:图像复原应用

数字图像处理&#xff1a;图像复原应用 1.1 什么是图像复原&#xff1f; 图像复原是图像处理中的一个重要领域&#xff0c;旨在从退化&#xff08;例如噪声、模糊等&#xff09;图像中恢复出尽可能接近原始图像的结果。图像复原与图像增强不同&#xff0c;复原更多地依赖于图…

ES6 Promise的用法

学习链接&#xff1a;ES6 Promise的用法&#xff0c;ES7 async/await异步处理同步化&#xff0c;异步处理进化史_哔哩哔哩_bilibili 一、同步与异步区别 1.JavaScript代码是单线程的程序&#xff0c;即通过一行一行代码顺序执行&#xff0c;即同步概念。 2.若处理一些简短、…

数据结构部分混淆

1.随机存储和顺序存储&#xff1a; 随机存取&#xff1a;数组&#xff0c;当存储器中的数据被读取或写入时&#xff0c;所需要的时间与该数据所在的物理地址无关 顺序存取&#xff1a;链表&#xff0c;当存储器中的数据被读取或写入时&#xff0c;所需要的时间与该数据所在的物…

力扣之1412.查找成绩处于中游的学生

题目&#xff1a; sql建表语句&#xff1a; Create table If Not Exists Student (student_id int, student_name varchar(30)); Create table If Not Exists Exam (exam_id int, student_id int, score int); Truncate table Student; insert into Student (student_id,…

linux环境下的程序设计与git操作

目录 前言&#xff1a; 进度条小程序&#xff1a; 先介绍几个背景知识 代码实现 Git操作 总结 其他指令 前言&#xff1a; 本文将重点介绍1. linux下的程序设计&#xff0c;并使用linux下的几个函数接口。实现一个简单的小程序 2.本着开源精神&#xff0c;进行git操作。…

OPENSSL-2023/11/10学习记录-C/C++对称分组加密DES

对称分组加密常用算法&#xff1a; DES 3DES AES 国密SM4 对称分组加密应用场景&#xff1a; 文件或者视频加密 加密比特币私钥 消息或者配置项加密 SSL通信加密 对称分组加密 使用异或实现一个简易的对称加密算法 A明文 B秘钥 AB密文AB (AB)B A 密码补全和初始化 数…

在Access中执行SQL语句

1.新建一个查询 2. 关闭弹出的窗口&#xff0c;创建一个空查询 3. 在“设计”页中点击“数据定义”进入输入SQL语句界面 4. “执行”后就能看到执行结果 5.如果想再次执行SQL&#xff0c;则可在MDI窗口标题栏右键&#xff0c;在弹出的菜单中选择“SQL 视图”即可

Vue向上滚动加载数据时防止内容闪动

目前的需求&#xff1a;当前组件向上滚动加载数据&#xff0c;dom加载完后&#xff0c;页面的元素位置不能发生变化 遇到的问题&#xff1a;加载完数据后&#xff0c;又把滚轮滚到之前记录的位置时&#xff0c;内容发生闪动 现在的方案&#xff1a; 加载数据之前记录整体滚动条…

Spring AI 整体介绍_关键组件快速入门_prompt_embedding等

Spring AI&#xff1a;Java开发者的AI集成新利器 在过去&#xff0c;Java开发者在构建AI应用时面临着缺乏统一框架的问题&#xff0c;导致不同AI服务的集成过程复杂且耗时。Spring AI应运而生&#xff0c;旨在为基于Java的应用程序提供一个标准化、高效且易于使用的AI开发平台…

51单片机的超声波视力保护仪【proteus仿真+程序+报告+原理图+演示视频】

1、主要功能 该系统由AT89C51/STC89C52单片机LCD1602显示模块温度传感器光照传感器超声波传感器按键、LED、蜂鸣器等模块构成。适用于视力保护仪、坐姿矫正器、超声波防近视等相似项目。 可实现功能: 1、LCD1602显示温度、光照、距离和学习时间 2、超声波传感器采集头部与探…

如何做好SQL 数据库安全

随着信息技术的迅猛发展&#xff0c;数据库在现代信息系统中的重要性日益凸显。无论是电子商务平台、金融系统还是社交媒体应用&#xff0c;数据库都是其核心组件之一。其中&#xff0c;SQL&#xff08;Structured Query Language&#xff0c;结构化查询语言&#xff09;数据库…

效率飞跃 | SOLIDWORKS 2025:草图与装配体设计再升级!

一年一度的SOLIDWORKS新版本已经发布&#xff0c;快来看看SOLIDWORKS 2025这些让您眼前一亮的新功能&#xff0c;它们将为您的研发过程增添强大助力。 一、草图绘制 1、通过 XYZ 点生成的曲线可以选取坐标系统 新版本可选择曲线起点位置 2、转换实体作为构造几何体 转换实体…

Science Robotics 通过新材料打造FiBa软机器人 可实现四种形态进化

近几年由于材料科学的进步&#xff0c;软机器人相关技术近几年研究成果显著&#xff0c;与传统的刚性机器人相比&#xff0c;软机器人的设计灵感来源于自然界中的生物系统&#xff0c;如蠕虫、章鱼、壁虎和青蛙等。这些生物利用柔软、有弹性的材料&#xff0c;在复杂环境中展现…