首页 > 编程语言 >Python工具箱系列:Pandas 数据清洗与预处理详解

Python工具箱系列:Pandas 数据清洗与预处理详解

时间:2024-10-31 15:51:28浏览次数:7  
标签:Python column 预处理 df date 工具箱 数据 Pandas

目录

一、数据清洗与预处理的重要性

二、Pandas 简介

三、Pandas 数据清洗与预处理技巧

1. 读取数据

2. 查看数据

3. 处理缺失值

4. 处理重复值

5. 处理异常值

6. 处理数据类型不一致

7. 处理数据格式不一致

8. 数据标准化和归一化

9. 数据编码

四、案例:使用 Pandas 进行数据清洗与预处理

总结



数据清洗与预处理是数据分析中的关键步骤,其目的是确保数据的质量,提高数据分析的准确性和可靠性。Pandas 是 Python 中非常流行的数据处理库,提供了丰富的数据清洗与预处理功能。本文将详细介绍 Pandas 在数据清洗与预处理中的应用,并通过代码和案例帮助新手朋友理解和掌握这些技巧。

一、数据清洗与预处理的重要性

在数据分析过程中,数据清洗与预处理占据了大部分时间。数据通常来源于多个不同的数据源,存在以下问题:

  • 缺失值:数据集中可能存在缺失值,需要填充或删除。
  • 重复值:数据集中可能存在重复的记录,需要删除。
  • 异常值:数据集中可能存在异常值(离群值),需要处理。
  • 数据类型不一致:数据集中的列可能包含不同类型的数据,需要统一数据类型。
  • 数据格式不一致:数据集中的日期、时间、字符串等格式可能不一致,需要规范化。

通过数据清洗与预处理,可以确保数据的一致性和准确性,为后续的数据分析和建模打下良好的基础。

二、Pandas 简介

Pandas 是一个开源的 Python 数据处理库,提供了高性能、易用的数据结构和数据分析工具。Pandas 的核心数据结构包括:

  • Series:一维数组,可以存储任何数据类型(整数、浮点数、字符串、Python 对象等),每个元素都有一个标签(索引)。
  • DataFrame:二维的、表格型的数据结构,可以看作是由多个 Series 组成的字典(每个 Series 成为一列)。

Pandas 提供了丰富的函数和方法,用于数据的读取、写入、清洗、预处理、统计分析和可视化等。

三、Pandas 数据清洗与预处理技巧

1. 读取数据

在进行数据清洗与预处理之前,首先需要读取数据。Pandas 提供了多种读取数据的方法,如 read_csv、read_excel、read_sql 等。

import pandas as pd  
  
# 读取 CSV 文件  
df = pd.read_csv('data.csv')  
  
# 读取 Excel 文件  
df = pd.read_excel('data.xlsx', sheet_name='Sheet1')  
  
# 读取 SQL 数据库  
import sqlite3  
conn = sqlite3.connect('database.db')  
df = pd.read_sql('SELECT * FROM table_name', conn)

2. 查看数据

在读取数据后,通常需要查看数据的基本信息,以便了解数据的结构和内容。

# 查看数据的前几行  
print(df.head())  
  
# 查看数据的后几行  
print(df.tail())  
  
# 查看数据的列名  
print(df.columns)  
  
# 查看数据的索引  
print(df.index)  
  
# 查看数据的基本信息(行数、列数、数据类型等)  
print(df.info())  
  
# 查看数据的统计信息(最小值、最大值、平均值、四分位数等)  
print(df.describe())

3. 处理缺失值

缺失值是数据清洗中常见的问题。Pandas 提供了多种处理缺失值的方法,如删除缺失值、填充缺失值等。

# 查看缺失值的情况  
print(df.isnull().sum())  
  
# 删除包含缺失值的行  
df_dropna = df.dropna()  
  
# 删除包含缺失值的列  
df_dropna_axis1 = df.dropna(axis=1)  
  
# 填充缺失值(使用均值、中位数、众数等)  
df_fillna_mean = df.fillna(df.mean())  # 使用均值填充  
df_fillna_median = df.fillna(df.median())  # 使用中位数填充  
df_fillna_mode = df.fillna(df.mode().iloc[0])  # 使用众数填充  
  
# 填充缺失值(使用前一个或后一个非缺失值)  
df_fillna_ffill = df.fillna(method='ffill')  # 使用前一个非缺失值填充  
df_fillna_bfill = df.fillna(method='bfill')  # 使用后一个非缺失值填充

4. 处理重复值

重复值也是数据清洗中常见的问题。Pandas 提供了 drop_duplicates 方法来删除重复值。

# 查看重复值的情况  
print(df.duplicated().sum())  
  
# 删除重复值(保留第一个出现的记录)  
df_drop_duplicates = df.drop_duplicates()  
  
# 删除重复值(保留最后一个出现的记录)  
df_drop_duplicates_keep_last = df.drop_duplicates(keep='last')  
  
# 删除重复值(根据指定列判断重复)  
df_drop_duplicates_subset = df.drop_duplicates(subset=['column1', 'column2'])

5. 处理异常值

异常值(离群值)可能对数据分析结果产生较大影响。Pandas 本身没有直接提供检测异常值的方法,但可以结合其他库(如 NumPy、SciPy)或自定义函数来检测和处理异常值。

import numpy as np  
  
# 使用箱线图(IQR)方法检测异常值  
Q1 = df['column'].quantile(0.25)  
Q3 = df['column'].quantile(0.75)  
IQR = Q3 - Q1  
lower_bound = Q1 - 1.5 * IQR  
upper_bound = Q3 + 1.5 * IQR  
  
# 过滤异常值  
df_filtered = df[(df['column'] >= lower_bound) & (df['column'] <= upper_bound)]  
  
# 替换异常值(使用均值、中位数等)  
df['column'] = np.where((df['column'] < lower_bound) | (df['column'] > upper_bound), df['column'].median(), df['column'])

6. 处理数据类型不一致

数据类型不一致可能导致数据运算出错。Pandas 提供了 astype 方法来转换数据类型。

# 查看数据类型  
print(df.dtypes)  
  
# 转换数据类型  
df['column'] = df['column'].astype('float64')  # 转换为浮点型  
df['column'] = df['column'].astype('int64')  # 转换为整型  
df['column'] = df['column'].astype('str')  # 转换为字符串型  
  
# 转换多列的数据类型  
df = df.astype({'column1': 'float64', 'column2': 'int64', 'column3': 'str'})

7. 处理数据格式不一致

数据格式不一致(如日期、时间格式)会影响数据的分析和处理。Pandas 提供了 to_datetime、strftime 等方法来处理日期和时间数据。

# 将字符串转换为日期类型  
df['date_column'] = pd.to_datetime(df['date_column'], format='%Y-%m-%d')  
  
# 将日期类型转换为字符串  
df['date_column'] = df['date_column'].dt.strftime('%Y-%m-%d')  
  
# 提取日期中的年、月、日  
df['year'] = df['date_column'].dt.year  
df['month'] = df['date_column'].dt.month  
df['day'] = df['date_column'].dt.day

8. 数据标准化和归一化

数据标准化和归一化是数据预处理中的常见操作,用于消除不同量纲的影响,提高模型的收敛速度和性能。Pandas 本身没有直接提供数据标准化和归一化的方法,但可以结合 NumPy 或 Scikit-learn 库来实现。

from sklearn.preprocessing import StandardScaler, MinMaxScaler  
  
# 数据标准化(Z-score 标准化)  
scaler = StandardScaler()  
df_scaled = scaler.fit_transform(df[['column1', 'column2']])  # 对指定列进行标准化  
df_scaled = pd.DataFrame(df_scaled, columns=['column1_scaled', 'column2_scaled'])  
  
# 数据归一化(Min-Max 归一化)  
scaler = MinMaxScaler()  
df_normalized = scaler.fit_transform(df[['column1', 'column2']])  # 对指定列进行归一化  
df_normalized = pd.DataFrame(df_normalized, columns=['column1_normalized', 'column2_normalized'])

9. 数据编码

对于分类变量(离散变量),通常需要进行编码处理,以便将其转换为模型可以处理的数值型数据。Pandas 提供了 factorize 方法和 get_dummies 函数来进行数据编码。

# 因子化编码(将分类变量转换为数值型变量和对应的标签)  
labels, unique = pd.factorize(df['category_column'])  
df['category_column_encoded'] = labels  
  
# 独热编码(One-Hot Encoding)  
df_dummies = pd.get_dummies(df, columns=['category_column'])

四、案例:使用 Pandas 进行数据清洗与预处理

假设我们有一个名为 sales_data.csv 的数据集,包含以下列:date, store, product, sales, price, promotion。我们将对这个数据集进行一系列的数据清洗与预处理操作。

1. 读取数据

df = pd.read_csv('sales_data.csv')

2. 查看数据

# 查看前几行数据  
print(df.head())  
  
# 查看数据的基本信息  
print(df.info())  
  
# 查看数据的统计信息  
print(df.describe())

3. 处理缺失值

# 查看缺失值情况  
print(df.isnull().sum())  
  
# 假设我们决定删除包含缺失值的行  
df = df.dropna()

4. 处理重复值

# 查看重复值情况  
print(df.duplicated().sum())  
  
# 删除重复值(保留第一个出现的记录)  
df = df.drop_duplicates()

5. 处理异常值

# 假设我们要处理 'sales' 列中的异常值  
Q1 = df['sales'].quantile(0.25)  
Q3 = df['sales'].quantile(0.75)  
IQR = Q3 - Q1  
lower_bound = Q1 - 1.5 * IQR  
upper_bound = Q3 + 1.5 * IQR  
  
# 替换异常值(使用中位数替换)  
df['sales'] = np.where((df['sales'] < lower_bound) | (df['sales'] > upper_bound), df['sales'].median(), df['sales'])

6. 处理数据类型不一致

# 假设 'price' 列应该是浮点型,但读取时是字符串型  
df['price'] = df['price'].astype('float64')

7. 处理数据格式不一致

# 将 'date' 列转换为日期类型  
df['date'] = pd.to_datetime(df['date'], format='%Y-%m-%d')  
  
# 提取年份、月份和日期作为新列  
df['year'] = df['date'].dt.year  
df['month'] = df['date'].dt.month  
df['day'] = df['date'].dt.day  
  
# 如果不再需要原始的 'date' 列,可以删除它  
# df = df.drop(columns=['date'])

8. 数据标准化

# 对 'sales' 和 'price' 列进行标准化处理  
scaler = StandardScaler()  
scaled_features = scaler.fit_transform(df[['sales', 'price']])  
  
# 将标准化后的数据转换为新的 DataFrame  
scaled_df = pd.DataFrame(scaled_features, columns=['sales_scaled', 'price_scaled'])  
  
# 如果需要将标准化后的数据与原数据合并  
# df = pd.concat([df, scaled_df], axis=1)  
# 注意:这里我们仅展示了如何标准化,实际使用时可能需要根据需求决定是否合并

9. 数据编码

# 对 'store' 和 'product' 列进行独热编码  
df_encoded = pd.get_dummies(df, columns=['store', 'product'])

10. 保存处理后的数据

# 将处理后的数据保存到新的 CSV 文件中  
df_encoded.to_csv('cleaned_sales_data.csv', index=False)

总结

通过上述步骤,我们演示了如何使用 Pandas 对一个数据集进行完整的数据清洗与预处理流程。这包括读取数据、查看数据、处理缺失值、处理重复值、处理异常值、处理数据类型不一致、处理数据格式不一致、数据标准化、数据编码以及保存处理后的数据。这些步骤是数据分析中不可或缺的一部分,能够帮助我们确保数据的质量,为后续的分析和建模打下良好的基础。

标签:Python,column,预处理,df,date,工具箱,数据,Pandas
From: https://blog.csdn.net/weixin_43856625/article/details/143393279

相关文章

  • Python数据类型之自定义类型——Class与面向对象编程详解
    目录引言一、面向对象编程基础二、类的定义与对象的创建三、封装性四、继承性五、多态性六、特殊方法与数据类七、使用dataclass装饰器八、面向对象编程的优势结论引言Python是一门功能强大的编程语言,其面向对象编程(OOP)的特性更是为开发者提供了极大的灵活性和......
  • python小白入手第一章基础知识
    单行注释:用#开头,#右边的部分即为所要注释的内容多行注释:用一对三个双引号引起来例子:print("Hi")#print("hello"),相应的第二个print语句不会执行钱包案例:目前学习的三种数据类型:string、int、floattype()语句的使用:在print语句中,直接输出类型信息,同时也可以将数据存储到变量中,......
  • Python三方库:Pika(RabbitMQ基础使用)
    https://www.cnblogs.com/-hz01/p/17985502  Python有多种插件都支持RabbitMQ,本文介绍的是RabbitMQ推荐的Pika插件。使用pip直接安装即可 pipinstallpika 。一、RabbitMQ简介1.MQ简介MQ(MessageQueue,消息队列),是一个在消息传输过程中保存消息的容器,多用在分布式系统之......
  • python变量
    1.变量Python中的变量不需要声明。每个变量在使用前都必须赋值,变量赋值以后该变量才会被创建。变量定义规则变量名只能是数字,字母或下划线的任意组合变量名的第一个字符不能是数字保留字即关键字,我们不能把它们用作任何标识符名称。Python的标准库提供了一个keyword......
  • python 自动将歌曲按照歌手分类创建软链接
    要使用Python获取MP3文件的信息,可以使用pymediainfo包。首先,你需要安装pymediainfo。下面是获取一首歌曲信息的例子"""Moduletodemonstratehowtouse`pymediainfo`toreadmetadatafromamediafile.Inthismodule,wereadthemetadataofagivenMP3fileand......
  • 西安短期驻场:python+flask/django 1.5万/月可谈
    驻场周期:2个月,不包食宿。地点:西安高新区费用:1.5万/月。可谈python后台开发岗位要求:-本科及以上学历,计算机相关专业,3年以上开发经验。-熟悉Python及其主流框架flask或django。-熟悉数据库设计与优化,如MySQL、Mango等,具备数据库性能调优经验。-熟练使用Git等版本控制工具,具备......
  • Leetcode刷题Python之3165.不包含相邻元素的子序列的最大和
    提示:利用线段树解决不包含相邻元素的子序列最大和问题。文章目录一、题目描述示例二、解题思路1.思路分析2.线段树的状态设计3.线段树的操作三、代码实现代码详细解释四、总结时间复杂度分析一、题目描述给定一个整数数组nums和一个二维数组queries,其中q......
  • Python+Django框架淘宝家用电器销售数据可视化系统作品截图和开题报告参考
     博主介绍:黄菊华老师《Vue.js入门与商城开发实战》《微信小程序商城开发》图书作者,CSDN博客专家,在线教育专家,CSDN钻石讲师;专注大学生毕业设计教育、辅导。所有项目都配有从入门到精通的基础知识视频课程,学习后应对毕业设计答辩,提供核心代码讲解,答辩指导。项目配有对应开发......
  • python安装
    系统:win11安装版本:3.13.0一、检查检查电脑内是否已存在python,打开cmd,指令python或者python-V如果已存在旧版本的python,先删除旧版本二、下载安装程序官网地址下载地址默认下载window环境下的最新版本,可自行选择其他系统和其他版本。三、开始安装1.选择addtoPATH......
  • Python中list列表的所有方法
    Python中list列表的所有方法方法描述返回值list.append()在列表末尾添加指定元素,如果增加的是序列会形成嵌套。无返回,直接修改。list.extend()在列表末尾逐个添加指定序列中的所有元素。无返回,直接修改。list.insert()将对象插入列表指定位置,如果增加的是序列会形成嵌套。无返......