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

devtools/2024/10/18 21:48:36/

pandas__1">使用 pandas 进行数据清洗

一、引言

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

数据清洗的重要性

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

pandas__14">pandas 在数据清洗中的优势

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

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

本博客的目的

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

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

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


pandas__36">二、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 StandardScalerscaler = StandardScaler()
df['Age_scaled'] = scaler.fit_transform(df[['Age']])

规范化

from sklearn.preprocessing import MinMaxScalermin_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)。
  • 机器学习建模:使用清洗后的数据进行模型训练和评估。

十三、参考资料

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

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


http://www.ppmy.cn/devtools/126829.html

相关文章

Git基础-配置http链接的免密登录

问题描述 当我们在使用 git pull 或者 git push 进行代码拉取或代码提交时&#xff0c; 若我们的远程代码仓库是 http协议的链接时&#xff0c;就是就会提示我们进行账号密码的登录。 每次都要登录&#xff0c;这未免有些麻烦。 本文介绍一下免密登录的配置。解决方案 1 执行…

apache pulsar 安装最新版本, docker安装pulsar3.3.2

1. 官网地址&#xff1a; Run a standalone Pulsar cluster in Docker | Apache Pulsar 2. 下载镜像&#xff1a; 2.1 选择镜像版本&#xff1a; https://hub.docker.com/r/apachepulsar/pulsar/tags 2.2 版本3.3.2 docker pull apachepulsar/pulsar:3.3.2 3. 安装&#xff…

【Golang】Go语言中的反射原理解析与应用实战

✨✨ 欢迎大家来到景天科技苑✨✨ &#x1f388;&#x1f388; 养成好习惯&#xff0c;先赞后看哦~&#x1f388;&#x1f388; &#x1f3c6; 作者简介&#xff1a;景天科技苑 &#x1f3c6;《头衔》&#xff1a;大厂架构师&#xff0c;华为云开发者社区专家博主&#xff0c;…

Flutter结合鸿蒙next 中数据类型转换的高级用法:dynamic 类型与其他类型的转换解析

目录 写在前面 1. 什么是 dynamic 类型&#xff1f; 示例 2. dynamic 与其他类型的转换 2.1 强制类型转换 示例 2.2 使用 is 操作符 示例 2.3 从 List 转换 示例 3. dynamic 类型的最佳实践 3.1 避免过度使用 dynamic 3.2 使用 Null Safety 示例 3.3 异常处理 示…

【Oracle 数据库技术分享】BLOB 与 CLOB 的选择与应用

【Oracle 数据库技术分享】BLOB 与 CLOB 的选择与应用 文章目录 前言一、为什么选择 BLOB 或 CLOB&#xff1f;二、BLOB 与 CLOB 的区别1.数据类型2.性能3.功能4.兼容性5.存储限制6.查询和处理 三、选择 BLOB 或 CLOB 的建议1.根据数据类型选择2.考虑性能需求3.兼容性和集成4.综…

MFC工控项目实例二十四模拟量校正值输入

承接专栏《MFC工控项目实例二十三模拟量输入设置界面》 对模拟量输入的零点校正值及满量程对应的电压值进行输入。 1、在SenSet.h文件中添加代码 #include "BtnST.h" #include "ShadeButtonST.h"/ // SenSet dialogclass SenSet : public CDialog { // Co…

Java初学者的学习顺序

学习 Java 语言的全面流程可以分为多个阶段&#xff0c;从基础概念、编程语法、面向对象设计&#xff0c;到高级应用和项目实践&#xff0c;逐步深入。下面是一个详细的 Java 学习路径&#xff0c;适合初学者和中级开发者。 一、初级阶段&#xff1a;Java 基础语法 1. 安装和…

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

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