一、引言
在数据处理与分析的广阔领域中,Python 的 Pandas 库无疑是一颗璀璨的明星 。它提供了快速、灵活、明确的数据结构,旨在简单、直观地处理关系型、标记型数据,无论是数据挖掘、机器学习,还是数据分析与可视化,Pandas 都扮演着不可或缺的角色。从读取、清洗原始数据,到对数据进行复杂的转换、分析操作,Pandas 以其丰富的函数和方法,极大地简化了数据处理流程,成为了数据科学家、分析师以及 Python 开发者们手中的得力工具。
然而,在实际应用中,面对各种各样的数据处理需求,编写 Pandas 代码并非总是一帆风顺。有时,实现一个特定的数据清洗或转换任务,可能需要花费大量时间去查阅文档、回忆函数用法、调试代码。这时,借助提示词生成代码的技术应运而生,它为提高数据处理效率开辟了一条新的路径。通过简洁明了的自然语言描述,即可快速生成对应的 Pandas 代码,将开发者从繁琐的代码编写中解放出来,专注于数据处理的逻辑和业务目标,使得数据处理工作变得更加高效、便捷。接下来,就让我们一同深入探索如何利用提示词生成强大的数据清洗与转换代码(Pandas)。
二、环境搭建
2.1 安装 Python
Python 作为当今最受欢迎的编程语言之一,拥有丰富的库和工具,是实现数据清洗与转换的核心基础。其官网(https://www.python.org/downloads/ )提供了各个版本的安装包,适配 Windows、macOS 和 Linux 等多种主流操作系统。
- Windows 系统:在官网下载对应版本的.exe 安装文件,运行安装程序。在安装过程中,务必勾选 “Add Python to PATH” 选项,这能将 Python 添加到系统环境变量中,方便后续在命令行中直接调用 Python。例如,下载了 Python 3.10 的安装包,双击运行后,按照提示逐步完成安装,勾选上述选项后,即可在命令提示符(CMD)中输入 “python” 来启动 Python 解释器。
- macOS 系统:可以从官网下载.pkg 安装文件进行常规安装;若已安装 Homebrew,使用命令 “brew install python” 即可快速完成安装。安装完成后,打开终端,输入 “python3” 便能进入 Python 环境。
- Linux 系统:多数 Linux 发行版都自带 Python,但版本可能较低。以 Ubuntu 为例,可通过命令 “sudo apt-get update” 更新软件源,再执行 “sudo apt-get install python3” 安装 Python 3。安装完毕后,在终端输入 “python3 --version” 可查看安装的 Python 版本。
2.2 安装 Pandas
Pandas 库是 Python 进行数据处理的关键工具,安装它也十分简便,借助 Python 的包管理工具 pip 即可完成。在命令行中输入 “pip install pandas”,pip 会自动从 Python Package Index(PyPI)下载并安装最新版本的 Pandas 及其依赖项。
不过,安装过程中可能会遇到一些问题:
- 网络问题:若因网络不稳定导致安装失败,可尝试更换镜像源,比如使用国内的清华大学镜像源 “pip install pandas -i https://pypi.tuna.tsinghua.edu.cn/simple” ,加快下载速度,提高安装成功率。
- 权限问题:在某些系统中,可能因权限不足安装失败。在 Linux 或 macOS 系统下,可使用 “sudo pip install pandas” 获取管理员权限进行安装;Windows 系统则需右键点击命令提示符,选择 “以管理员身份运行”,再执行安装命令。
- 依赖项问题:Pandas 依赖 NumPy 等库,若缺失相关依赖,可能安装出错。此时应先安装缺失的依赖项,如 “pip install numpy” ,再重新安装 Pandas。安装完成后,可在 Python 交互式环境中输入 “import pandas as pd; print (pd.version)” ,若能正确输出版本号,则表明 Pandas 安装成功。
2.3 选择合适的代码编辑器
一款好的代码编辑器能极大提升编程效率,对于使用 Pandas 进行数据处理,有几款编辑器备受青睐:
- PyCharm:这是一款专业的 Python 集成开发环境(IDE),由 JetBrains 公司开发。它具备强大的代码智能补全功能,当输入代码时,能根据上下文自动提示可能的函数、变量等,大大节省输入时间;丰富的调试工具可以设置断点、单步执行代码,方便排查错误;还支持版本控制集成,与 Git 等版本控制系统无缝衔接。初次使用时,创建新项目后,在 “File” - “Settings” 中可配置 Python 解释器,选择已安装的 Python 环境。编写代码时,按下 “Ctrl + Space” 可触发代码补全,点击左侧行号添加断点,再点击 “Debug” 按钮即可进入调试模式。
- VS Code:微软推出的轻量级代码编辑器,具有跨平台、开源的特点。它拥有丰富的插件生态,安装 Python 插件后,便具备了强大的 Python 开发能力。例如安装 “Python” 插件后,能实现代码语法高亮、智能提示等功能;安装 “Pylance” 插件,可进一步提升代码分析和智能补全的效果。在 VS Code 中,通过 “File” - “Open Folder” 打开项目文件夹,新建 Python 文件即可开始编写代码。按下 “Ctrl + Shift + P” 调出命令面板,输入 “Python: Select Interpreter” 可选择 Python 解释器。
三、提示词基础
3.1 提示词的重要性
在借助工具生成 Pandas 代码的过程中,提示词扮演着至关重要的角色,堪称连接我们需求与代码实现的桥梁。清晰准确的提示词,是获取符合预期代码的关键前提。倘若提示词表述模糊、含混不清,生成的代码很可能与我们期望的功能大相径庭,甚至出现严重的逻辑错误 ,导致后续花费大量时间去调试和修改,大大降低工作效率。例如,若只是简单地向模型描述 “处理数据”,模型根本无法知晓具体要进行何种数据清洗操作,是去除重复值、处理缺失值,还是进行数据格式转换,又或者是进行复杂的数据转换,如透视表操作、数据合并与连接等。由于缺乏明确指令,模型生成的代码可能毫无用处。相反,若提示词详细且精准,如 “读取一个 CSV 文件,将其中‘日期’列的数据类型转换为 datetime 格式,删除所有含有缺失值的行,并按照‘销售额’列降序排列数据”,模型便能依据这些清晰的指示,生成准确实现该功能的 Pandas 代码,让数据处理工作得以顺利推进。
3.2 编写有效提示词的原则
3.2.1 明确目标
在编写提示词时,首要原则便是清晰、明确地阐述想要实现的数据清洗与转换任务。这就如同航海时明确目的地,只有目标清晰,才能确保生成的代码朝着正确方向前行。例如,若要对一份销售数据进行处理,不能仅仅表述为 “对销售数据进行清洗”,而应具体说明 “从销售数据中删除销量为零的记录,并将‘销售日期’列转换为日期时间格式,方便后续按日期统计分析”。这样明确的目标描述,能让模型精准把握需求,避免生成无关或错误的代码。在实际应用中,还需根据具体业务场景进一步细化目标。比如,在处理金融交易数据时,若要筛选出特定时间段内的大额交易记录,需明确给出时间段范围,如 “筛选出 2023 年 1 月 1 日至 2023 年 12 月 31 日之间,交易金额大于 10000 元的记录” ,使模型生成的代码能准确满足业务需求。
3.2.2 提供细节
为了让模型生成切实可用的代码,提供丰富的细节信息必不可少。这些细节涵盖数据格式、数据来源、处理要求等多个关键方面。以数据格式为例,若处理的是一份 Excel 文件,要明确说明数据存储在哪个工作表中,各列的数据类型是什么,如 “数据存储在 Excel 文件‘sales.xlsx’的‘Sheet1’工作表中,‘产品 ID’列为文本型,‘销售数量’列为数值型”。关于数据来源,需告知模型数据是来自本地文件、数据库,还是网络接口,如 “数据从本地 CSV 文件‘customer_data.csv’读取” 或者 “从 MySQL 数据库的‘orders’表中获取数据”。处理要求则要详细说明各种具体的操作细节,如 “对‘价格’列的数据进行去重处理,保留首次出现的值,然后计算该列的平均值、中位数和标准差”。再比如,若要对图片数据进行处理,除了说明是对本地图片文件夹中的图片进行操作外,还需提供图片的格式(如 JPEG、PNG)、处理要求(如调整尺寸为 200x200 像素、转换为灰度图)等细节信息,模型才能依据这些信息生成正确的 Python 代码,借助 Pillow 等库实现相应的图片处理功能。
3.2.3 规范语言
使用简洁、易懂、无歧义的语言表达需求,是编写有效提示词的又一重要原则。避免使用复杂生僻的词汇和语法结构,确保模型能够准确理解我们的意图。例如,不要使用晦涩难懂的行业黑话或专业术语缩写,若必须使用,需加以解释说明。在描述数据处理任务时,尽量采用简单直接的表达方式,如 “将‘姓名’列和‘年龄’列合并成一个新列,新列名为‘人员信息’,格式为‘姓名 - 年龄’” ,而不是使用复杂的表述。同时,要注意语言的准确性,避免产生歧义。比如,“删除小于 10 的数据” 这种表述就不够准确,应明确说明是删除 “值小于 10 的记录” 还是 “列中小于 10 的元素”。若处理的是地理空间数据,在描述坐标转换任务时,要清晰准确地说明源坐标系和目标坐标系,如 “将 WGS84 坐标系下的经纬度坐标转换为 GCJ-02 坐标系下的坐标” ,防止因语言表述不清导致模型生成错误的代码。
四、数据读取
4.1 读取 CSV 文件
CSV(Comma-Separated Values)文件是一种常见的数据存储格式,以纯文本形式存储表格数据,数据字段由逗号分隔 。在 Python 中,使用 Pandas 的read_csv函数读取 CSV 文件十分便捷,以下是一个简单的示例:
import pandas as pd
# 读取CSV文件为DataFrame结构
data = pd.read_csv('data.csv')
print(data.head())
上述代码中,首先导入 Pandas 库并别名为pd,然后使用read_csv函数读取当前目录下的data.csv文件,将其存储为一个DataFrame对象,DataFrame是 Pandas 中用于存储和处理表格数据的二维数据结构。最后通过head()方法查看数据的前 5 行,以快速了解数据的大致内容和结构。
read_csv函数包含多个常用参数,用于灵活处理不同格式的 CSV 文件:
- filepath_or_buffer:这是必选参数,指定 CSV 文件的路径,可以是本地文件路径,如'C:/data/data.csv' ,也可以是 URL 链接,例如'https://example.com/data.csv' ,用于读取网络上的 CSV 文件。
- sep:用于指定字段之间的分隔符,默认值为',' ,即逗号分隔。若 CSV 文件使用其他字符作为分隔符,如制表符'\t',则需将sep参数设置为'\t' ,即data = pd.read_csv('data.tsv', sep='\t') ,这样才能正确解析文件内容。
- header:用于指定哪一行作为列名(表头)。默认值为'infer' ,表示 Pandas 会自动推断,若文件的第一行是列名,Pandas 会将其作为列名处理;若文件没有列名,可以设置header=None ,此时 Pandas 会自动生成从 0 开始的整数作为列名;也可以传入一个整数或整数列表,指定某一行或某几行作为列名,例如header=1表示将第二行作为列名,header=[0, 1]则表示将第一行和第二行都作为列名,形成多级表头。
- index_col:指定某一列或某几列作为DataFrame的索引。可以传入列名或列的索引位置,例如index_col='id'表示将id列作为索引,index_col=[0, 1]表示将第一列和第二列共同作为复合索引。
- usecols:用于指定需要读取的列。可以传入列名列表,如usecols=['name', 'age'] ,表示只读取name和age两列数据,这样可以减少数据读取量,提高读取效率,尤其是对于大型 CSV 文件。
4.2 读取 Excel 文件
Excel 文件是另一种常见的数据存储和交换格式,Pandas 提供了read_excel函数用于读取 Excel 文件。例如,读取一个包含销售数据的 Excel 文件:
import pandas as pd
# 读取Excel文件中Sheet1工作表的数据
data = pd.read_excel('sales_data.xlsx', sheet_name='Sheet1')
print(data.head())
这段代码导入 Pandas 库后,使用read_excel函数读取sales_data.xlsx文件中名为Sheet1的工作表数据,同样将其存储为DataFrame对象,并查看前 5 行数据。
当处理包含多个工作表的 Excel 文件时,sheet_name参数的使用就显得尤为重要:
- 如果只需要读取某一个特定的工作表,将sheet_name设置为该工作表的名称即可,如上述示例中读取Sheet1工作表;
- 若要读取多个工作表,可以将sheet_name设置为一个包含多个工作表名称的列表,例如sheet_name=['Sheet1', 'Sheet3'] ,此时read_excel函数会返回一个字典,字典的键是工作表名称,值是对应工作表数据的DataFrame对象,通过data['Sheet1'] 、data['Sheet3']可以分别访问这两个工作表的数据;
- 若要读取所有工作表,将sheet_name设置为None ,函数同样返回一个字典,包含所有工作表的数据,键为工作表名称,值为对应DataFrame ,这样可以方便地对多个工作表的数据进行统一处理。
此外,read_excel函数还有一些其他参数,与read_csv函数部分参数类似,如header用于指定表头,index_col指定索引列,usecols指定读取的列等,其作用和使用方法与read_csv函数中的对应参数基本一致 ,可以根据实际需求灵活调整,以正确读取和处理 Excel 文件中的数据。
4.3 从数据库读取数据
在实际的数据处理项目中,常常需要从各种数据库中读取数据,如 MySQL、SQLite 等关系型数据库。以 MySQL 数据库为例,使用 Pandas 结合sqlalchemy库可以方便地实现数据读取:
from sqlalchemy import create_engine
import pandas as pd
# 数据库连接信息
user = 'root'
password = 'password'
host = '127.0.0.1'
port = '3306'
database = 'test_db'
# 创建数据库引擎
engine = create_engine(f'mysql+pymysql://{user}:{password}@{host}:{port}/{database}')
# 从数据库中读取数据
data = pd.read_sql_table('students', con=engine)
print(data.head())
上述代码首先导入create_engine函数和pandas库。接着,定义了 MySQL 数据库的连接信息,包括用户名、密码、主机地址、端口号和数据库名。然后,使用create_engine函数创建一个数据库引擎,连接到指定的 MySQL 数据库。这里使用mysql+pymysql作为数据库连接方式,pymysql是一个纯 Python 实现的 MySQL 客户端库,用于与 MySQL 数据库进行交互。最后,使用pd.read_sql_table函数从数据库中读取名为students的表数据,并将其存储为DataFrame对象,查看前 5 行数据。
对于 SQLite 数据库,由于其轻量级、无需单独服务器进程的特点,在一些小型项目或本地开发中应用广泛。使用 Pandas 读取 SQLite 数据库数据的代码示例如下:
import sqlite3
import pandas as pd
# 连接SQLite数据库
conn = sqlite3.connect('test.db')
# 执行SQL查询语句
query = "SELECT * FROM employees"
# 从数据库中读取数据
data = pd.read_sql_query(query, conn)
print(data.head())
# 关闭数据库连接
conn.close()
这段代码中,首先导入sqlite3库和pandas库。然后,使用sqlite3.connect函数连接到本地的test.db SQLite 数据库。接着,定义一个 SQL 查询语句,用于从名为employees的表中查询所有数据。之后,使用pd.read_sql_query函数执行 SQL 查询,并将查询结果存储为DataFrame对象,查看前 5 行数据。最后,使用conn.close()关闭数据库连接,释放资源,确保程序运行的稳定性和资源的合理利用。无论是从 MySQL 还是 SQLite 数据库读取数据,都需要根据数据库的特点和实际需求,正确编写 SQL 语句,以获取准确的数据,并结合 Pandas 强大的数据处理功能,进行后续的数据清洗与转换操作。
五、数据清洗实战
在数据处理过程中,原始数据往往存在各种各样的问题,如缺失值、重复值、异常值等,这些问题会严重影响数据分析的准确性和可靠性。因此,数据清洗是数据分析中至关重要的环节,它能够提高数据质量,为后续的分析和建模工作奠定坚实的基础。接下来,我们将结合具体代码示例,深入探讨使用 Pandas 进行数据清洗的常见方法和技巧。
5.1 缺失值处理
在数据集中,缺失值通常表示某些数据点没有被记录,这些缺失值可能是由于数据收集过程中的错误、设备故障或其他原因导致的。在 Pandas 中,缺失值通常用 NaN(Not a Number)表示。
5.1.1 检测缺失值
在处理缺失值之前,首先需要检测数据集中哪些位置存在缺失值。Pandas 提供了几种方法来检测缺失值:
- isnull():返回一个布尔值的 DataFrame,表示每个元素是否为缺失值。
- notnull():返回一个布尔值的 DataFrame,表示每个元素是否不是缺失值。
- isna() 和 notna():与isnull()和notnull()功能相同,只是名称不同。
以下是一个代码案例:
import pandas as pd
import numpy as np
# 创建一个包含缺失值的DataFrame
data = {'A':[1, 2, np.nan, 4],
'B':[5, np.nan, np.nan, 8],
'C':[9, 10, 11, 12]}
df = pd.DataFrame(data)
# 检测缺失值
print(df.isnull())
输出结果为:
A B C
0 False False False
1 False True False
2 True True False
3 False False False
5.1.2 删除缺失值
删除缺失值是最直接的方法,可以通过dropna()函数实现,该函数可以删除包含缺失值的行或列:
- axis=0:删除包含缺失值的行(默认)。
- axis=1:删除包含缺失值的列。
- how='any':只要有一个缺失值就删除(默认)。
- how='all':只有当所有值都是缺失值时才删除。
- thresh=n:至少有 n 个非缺失值才保留。
代码案例如下:
# 删除包含缺失值的行
df_drop_rows = df.dropna()
print(df_drop_rows)
# 删除包含缺失值的列
df_drop_cols = df.dropna(axis=1)
print(df_drop_cols)
输出结果为:
A B C
0 1 5 9
3 4 8 12
C
0 9
1 10
2 11
3 12
5.1.3 填充缺失值
填充缺失值是一种更灵活的方法,可以通过fillna()函数实现,用指定的值或方法填充缺失值:
- value:用指定的值填充缺失值。
- method='ffill':用前一个非缺失值填充(前向填充)。
- method='bfill':用后一个非缺失值填充(后向填充)。
代码案例如下:
# 用指定的值填充缺失值
df_fill_value = df.fillna(0)
print(df_fill_value)
# 前向填充
df_ffill = df.fillna(method='ffill')
print(df_ffill)
# 后向填充
df_bfill = df.fillna(method='bfill')
print(df_bfill)
输出结果为:
A B C
0 1.0 5.0 9
1 2.0 0.0 10
2 0.0 0.0 11
3 4.0 8.0 12
A B C
0 1.0 5.0 9
1 2.0 5.0 10
2 2.0 5.0 11
3 4.0 8.0 12
A B C
0 1.0 5.0 9
1 2.0 8.0 10
2 4.0 8.0 11
3 4.0 8.0 12
5.2 重复值处理
在数据处理中,重复值会导致数据模型出现数据偏差和冗余信息,处理重复值是数据清洗的一个重要步骤。pandas 提供了检查重复数据和删除重复数据的功能。
5.2.1 检测重复值
使用DataFrame.duplicated()方法可以检测重复行,返回一个布尔型的序列,表示每一行是否是重复的。默认情况下,它会标记除了第一次出现之外的所有重复行。
示例代码如下:
# 导入pandas库
import pandas as pd
# 创建字典作为模拟数据
data = {'A列':[1, 2, 2, 3, 2, 1],
'B列': [1, 1, 2, 3, 2, 1]}
# 将字典存入DataFrame对象中
df = pd.DataFrame(data)
# 检测重复行
duplicate = df.duplicated()
print(duplicate)
输出结果为:
0 False
1 False
2 False
3 False
4 True
5 True
dtype: bool
5.2.2 删除重复值
使用DataFrame.drop_duplicates()方法可以删除重复行。这个方法默认保留第一次出现的行,但可以通过参数调整保留最后一次出现的行或任何特定的行。
删除重复行,只保留第一次出现的行,示例代码如下:
# 导入pandas库
import pandas as pd
# 创建字典作为模拟数据
data = {'A列':[1, 2, 2, 3, 2, 1],
'B列': [1, 1, 2, 3, 2, 1]}
# 将字典存入DataFrame对象中
df = pd.DataFrame(data)
# 删除重复行,只保留第一次出现的行
drop_duplicates = df.drop_duplicates()
print(drop_duplicates)
输出结果为:
A列 B列
0 1 1
1 2 1
2 2 2
3 3 3
也可以删除所有重复行,只保留原始数据中唯一的行,示例代码如下:
# 导入pandas库
import pandas as pd
# 创建字典作为模拟数据
data = {'A列':[1, 2, 2, 3, 2, 1],
'B列': [1, 1, 2, 3, 2, 1]}
# 将字典存入DataFrame对象中
df = pd.DataFrame(data)
# 删除所有重复行,只保留原始数据中唯一的行
drop_duplicates = df.drop_duplicates(keep=False)
print(drop_duplicates)
输出结果为:
A列 B列
0 1 1
1 2 1
3 3 3
还可以通过subset参数指定某些列来检查重复项,保留第一次出现的行,示例代码如下:
# 导入pandas库
import pandas as pd
# 创建字典作为模拟数据
data = {'A列':[1, 1, 2, 3, 2, 3],
'B列': [1, 1, 2, 2, 2, 3],
'C列': [6, 5, 4, 3, 2, 1]}
# 指定A列、B列来检查重复项,并进行重复行删除
drop_duplicates = df.drop_duplicates(subset=['A列', 'B列'])
print(drop_duplicates)
输出结果为:
A列 B列 C列
0 1 1 6
2 2 2 4
3 3 3 3
5 3 3 1
5.3 异常值处理
异常值是指数据集中与其他数据点明显不同的数据点,这些数据点可能是由于数据录入错误、测量误差或其他原因导致的。异常值可能会对数据分析和建模结果产生严重影响,因此需要进行检测和处理。
5.3.1 检测异常值
可以利用统计方法(如 Z-Score)或可视化工具检测异常值:
- 使用 Z-Score:Z-Score 是一种统计方法,用于衡量数据点与平均值的偏差程度。通常,Z-Score 大于 3 或小于 - 3 的数据点被认为是异常值。
- 使用箱线图(Box Plot):箱线图是一种可视化方法,可以直观地显示数据的中位数、四分位数以及异常值。
以下是使用 Z-Score 检测异常值的代码示例:
import pandas as pd
import numpy as np
from scipy import stats
# 生成示例数据
data = pd.DataFrame({'price':[100, 150, 200, 250, 300, 1000, 350, 400, 450, 500, 5000]})
# 使用Z-Score检测异常值
z_scores = stats.zscore(data['price'])
abs_z_scores = np.abs(z_scores)
filtered_entries = abs_z_scores < 3
print(data[filtered_entries])
输出结果为:
price
0 100
1 150
2 200
3 250
4 300
6 350
7 400
8 450
9 500
使用箱线图检测异常值的代码示例:
import pandas as pd
import matplotlib.pyplot as plt
# 生成示例数据
data = pd.DataFrame({'price':[100, 150, 200, 250, 300, 1000, 350, 400, 450, 500, 5000]})
# 使用箱线图检测异常值
plt.boxplot(data['price'])
plt.title('Box Plot of Price')
plt.show()
运行上述代码,会弹出一个箱线图窗口,从图中可以直观地看到数据中的异常值。
5.3.2 处理异常值
常见的处理异常值的方法有删除异常值、修正异常值等:
- 删除异常值:直接删除包含异常值的行或列。
- 修正异常值:可以将异常值替换为均值、中位数或其他合理的值。
以下是删除异常值的代码示例:
import pandas as pd
import numpy as np
from scipy import stats
# 生成示例数据
data = pd.DataFrame({'price':[100, 150, 200, 250, 300, 1000, 350, 400, 450, 500, 5000]})
# 使用Z-Score检测异常值
z_scores = stats.zscore(data['price'])
abs_z_scores = np.abs(z_scores)
filtered_entries = abs_z_scores < 3
data_without_outliers = data[filtered_entries]
print(data_without_outliers)
输出结果与使用 Z-Score 检测异常值的示例相同,即删除了异常值后的数据集。
修正异常值的代码示例:
import pandas as pd
import numpy as np
from scipy import stats
# 生成示例数据
data = pd.DataFrame({'price':[100, 150, 200, 250, 300, 1000, 350, 400, 450, 500, 5000]})
# 使用Z-Score检测异常值
z_scores = stats.zscore(data['price'])
abs_z_scores = np.abs(z_scores)
# 修正异常值,将异常值替换为均值
mean_price = data['price'].mean()
data['price'] = np.where(abs_z_scores > 3, mean_price, data['price'])
print(data)
输出结果为:
price
0 100
1 150
2 200
3 250
4 300
5 445.454545
6 350
7 400
8 450
9 500
10 445.454545
在上述代码中,使用np.where()函数将 Z-Score 大于 3 的数据点(即异常值)替换为price列的均值。
六、数据转换实战
6.1 数据类型转换
6.1.1 数值类型转换
在实际的数据处理中,常常会遇到需要将对象类型的数据转换为数值类型的情况,比如将存储为字符串格式的数字转换为真正的数值,以便进行数学运算和统计分析。Pandas 提供了to_numeric函数来实现这一功能,它能将对象类型的数据转换为数值类型,并且可以灵活处理转换过程中遇到的各种问题。
假设我们有一个包含销售数据的DataFrame,其中 “销售额” 列的数据类型为对象类型(通常是字符串),我们希望将其转换为数值类型,以便进行后续的计算。代码示例如下:
import pandas as pd
# 创建示例数据
data = {
'产品': ['A', 'B', 'C', 'D'],
'销售额': ['100.5', '200', '300.75', '400']
}
df = pd.DataFrame(data)
# 将“销售额”列转换为数值类型
df['销售额'] = pd.to_numeric(df['销售额'], errors='coerce')
print(df.dtypes)
在上述代码中,pd.to_numeric(df['销售额'], errors='coerce')表示尝试将df['销售额']中的数据转换为数值类型。errors='coerce'参数指定了处理转换错误的方式,当遇到无法转换的值时,会将其替换为NaN。如果将errors参数设置为'raise' ,当遇到无法转换的值时,会抛出异常;若设置为'ignore' ,则会保留无法转换的值,结果仍为原始输入类型。运行上述代码后,df['销售额']的数据类型将变为float64,方便后续进行求和、平均值计算等数值运算。
6.1.2 日期类型转换
在数据分析中,处理日期数据是常见的任务之一。然而,原始数据中的日期信息可能以字符串形式存储,这不利于进行日期相关的计算和分析,如计算时间差、按日期分组统计等。此时,需要将字符串类型的日期数据转换为日期类型。Pandas 的to_datetime函数可以轻松实现这一转换。
例如,我们有一份包含订单信息的DataFrame,其中 “订单日期” 列是字符串类型,我们要将其转换为日期类型。代码如下:
import pandas as pd
# 创建示例数据
data = {
'订单号': ['001', '002', '003'],
'订单日期': ['2023-01-05', '2023-02-10', '2023-03-15']
}
df = pd.DataFrame(data)
# 将“订单日期”列转换为日期类型
df['订单日期'] = pd.to_datetime(df['订单日期'])
print(df.dtypes)
在这段代码中,pd.to_datetime(df['订单日期'])将df['订单日期']列中的字符串转换为datetime64[ns]类型的日期数据。转换后,我们可以方便地对日期进行各种操作,比如提取年份、月份、日期等信息,计算两个日期之间的差值,或者按日期进行排序和分组。例如,提取 “订单日期” 的年份:
df['订单年份'] = df['订单日期'].dt.year
print(df)
通过dt.year属性,我们成功从 “订单日期” 中提取出了年份,并将其存储在新的 “订单年份” 列中,为后续的数据分析提供了便利。
6.2 数据格式转换
6.2.1 使用 pivot 重塑数据
在数据处理过程中,常常需要改变数据的呈现格式,以满足不同的分析需求。pivot函数是 Pandas 中用于重塑数据的重要工具,它能够将数据从长格式转换为宽格式,通过指定索引、列和值,重新组织数据的结构,使数据的展示更加直观、便于分析。
以销售数据为例,假设我们有一个包含产品名称、销售地区和销售额的DataFrame,当前数据是长格式,每行表示一次销售记录。我们希望将其转换为宽格式,以产品名称为行索引,销售地区为列,销售额为对应的值,方便对比不同产品在各地区的销售情况。代码示例如下:
import pandas as pd
# 创建示例数据
data = {
'产品名称': ['苹果', '苹果', '香蕉', '香蕉'],
'销售地区': ['北京', '上海', '北京', '上海'],
'销售额': [1000, 1500, 800, 1200]
}
df = pd.DataFrame(data)
# 使用pivot重塑数据
pivot_df = df.pivot(index='产品名称', columns='销售地区', values='销售额')
print(pivot_df)
在上述代码中,df.pivot(index='产品名称', columns='销售地区', values='销售额')表示以 “产品名称” 作为新的行索引,“销售地区” 作为新的列,“销售额” 作为填充新表格的值。运行代码后,得到的pivot_df将是一个以产品名称为行、销售地区为列、销售额为单元格值的宽格式数据,这样可以更清晰地对比不同产品在不同地区的销售表现,方便进行数据分析和可视化。
6.2.2 使用 melt 重塑数据
与pivot函数相反,melt函数用于将数据从宽格式转换为长格式,它能将多个列的值 “融化” 到一列中,并创建一个新的列来存储原来的列名,使数据更适合进行某些类型的分析,如按特定列进行分组统计等。
继续以上述销售数据为例,假设我们已经有了一个宽格式的销售数据DataFrame,现在要将其转换回长格式,以便进行按产品和地区的汇总分析。代码如下:
import pandas as pd
# 创建宽格式示例数据
data = {
'产品名称': ['苹果', '香蕉'],
'北京': [1000, 800],
'上海': [1500, 1200]
}
df = pd.DataFrame(data).set_index('产品名称')
# 使用melt重塑数据
melt_df = df.reset_index().melt(id_vars='产品名称', var_name='销售地区', value_name='销售额')
print(melt_df)
在这段代码中,首先使用set_index('产品名称')将 “产品名称” 设置为索引,形成宽格式数据。然后,通过reset_index()恢复 “产品名称” 为普通列,再使用melt函数进行重塑。id_vars='产品名称'指定 “产品名称” 列不参与 “融化” 操作,保持不变;var_name='销售地区'指定新生成的列名,用于存储原来的列名(即销售地区);value_name='销售额'指定新生成的列名,用于存储原来列中的值(即销售额)。经过melt操作后,得到的melt_df是长格式数据,每行代表一次销售记录,包含产品名称、销售地区和销售额,方便进行后续的分组聚合等分析操作。
6.3 数据映射与替换
6.3.1 使用 map 进行数据映射
在数据处理中,经常需要根据某种映射关系对数据进行转换,比如将性别代码映射为完整的性别描述,将产品编号映射为产品名称等。Pandas 的map函数为实现这一功能提供了便利,它可以根据字典或函数对Series中的每个元素进行映射,从而快速完成数据的转换。
假设我们有一个包含学生信息的DataFrame,其中 “性别” 列存储的是性别代码(0 表示男,1 表示女),我们希望将其转换为完整的性别描述。代码示例如下:
import pandas as pd
# 创建示例数据
data = {
'姓名': ['张三', '李四', '王五'],
'性别': [0, 1, 0]
}
df = pd.DataFrame(data)
# 定义性别映射字典
gender_map = {0: '男', 1: '女'}
# 使用map进行数据映射
df['性别'] = df['性别'].map(gender_map)
print(df)
在上述代码中,首先定义了一个性别映射字典gender_map,其中键为性别代码,值为对应的性别描述。然后,通过df['性别'].map(gender_map)将 “性别” 列中的每个元素按照映射字典进行转换,将性别代码替换为完整的性别描述,使数据更易于理解和分析。除了使用字典进行映射,map函数还可以接受一个函数作为参数,对数据进行更复杂的转换操作。例如,我们有一个包含学生成绩的DataFrame,希望根据成绩划分等级:
import pandas as pd
# 创建示例数据
data = {
'姓名': ['张三', '李四', '王五'],
'成绩': [85, 92, 78]
}
df = pd.DataFrame(data)
# 定义成绩等级划分函数
def grade_score(score):
if score >= 90:
return 'A'
elif score >= 80:
return 'B'
elif score >= 70:
return 'C'
else:
return 'D'
# 使用map结合函数进行数据映射
df['成绩等级'] = df['成绩'].map(grade_score)
print(df)
在这段代码中,定义了一个grade_score函数,根据成绩划分等级。然后,通过df['成绩'].map(grade_score)将 “成绩” 列中的每个成绩传递给grade_score函数,根据函数返回值生成新的 “成绩等级” 列,实现了对成绩数据的映射转换,满足了数据分析中对成绩等级划分的需求。
6.3.2 使用 replace 替换数据
replace函数是 Pandas 中用于替换数据的强大工具,它可以在DataFrame或Series中查找并替换指定的值,支持多种替换方式,如单个值替换、多个值替换、使用字典进行替换等,为数据的清洗和转换提供了极大的灵活性。
例如,在一个包含产品销售数据的DataFrame中,发现 “产品名称” 列中存在一些错误的拼写,需要进行纠正。代码示例如下:
import pandas as pd
# 创建示例数据
data = {
'产品名称': ['苹果', '香焦', '橙子', '苹菓'],
'销售额': [1000, 800, 1200, 900]
}
df = pd.DataFrame(data)
# 替换“产品名称”列中的错误值
df['产品名称'] = df['产品名称'].replace(['香焦', '苹菓'], ['香蕉', '苹果'])
print(df)
在上述代码中,df['产品名称'].replace(['香焦', '苹菓'], ['香蕉', '苹果'])表示在 “产品名称” 列中查找 “香焦” 和 “苹菓”,并将它们分别替换为 “香蕉” 和 “苹果”,从而纠正了数据中的错误。
replace函数还可以使用字典进行更复杂的替换操作。假设我们有一个包含学生成绩的DataFrame,希望将成绩等级进行调整,如将 “A” 调整为 “A+”,“B” 调整为 “B+”。代码如下:
import pandas as pd
# 创建示例数据
data = {
'姓名': ['张三', '李四', '王五'],
'成绩等级': ['A', 'B', 'C']
}
df = pd.DataFrame(data)
# 使用字典进行数据替换
replace_dict = {'A': 'A+', 'B': 'B+'}
df['成绩等级'] = df['成绩等级'].replace(replace_dict)
print(df)
在这段代码中,定义了一个替换字典replace_dict,其中键是要被替换的值,值是替换后的新值。通过df['成绩等级'].replace(replace_dict),将 “成绩等级” 列中的 “A” 和 “B” 按照字典中的映射关系分别替换为 “A+” 和 “B+”,实现了对成绩等级数据的调整,以满足不同的分析需求。
七、综合案例
7.1 案例背景
随着电商行业的蓬勃发展,电商平台积累了海量的销售数据。这些数据蕴含着丰富的信息,对于企业制定营销策略、优化产品布局、提升客户服务质量等方面具有重要的指导意义。然而,原始的电商销售数据往往存在诸多问题,如数据缺失、重复记录、数据格式不一致以及异常值等,严重影响了数据分析的准确性和有效性。为了从这些数据中挖掘出有价值的信息,我们需要对数据进行清洗与转换,将其转化为适合分析的高质量数据。接下来,我们以某电商平台一段时间内的销售数据为例,详细介绍如何使用提示词生成 Pandas 代码,实现数据清洗与转换的全过程。
7.2 需求分析
- 数据读取:从 CSV 文件中读取电商销售数据,该文件包含订单编号、客户 ID、产品名称、销售数量、销售金额、销售日期、支付方式等字段。
- 数据清洗:
-
- 缺失值处理:检查各列数据,对于存在缺失值的记录,若 “销售金额” 列缺失,直接删除该记录;若其他非关键列存在缺失值,使用合适的值进行填充,如 “产品名称” 列缺失值填充为 “未知”。
-
- 重复值处理:查找并删除数据集中的重复记录,以确保每条记录的唯一性。
-
- 异常值处理:通过分析 “销售金额” 和 “销售数量” 列的数据分布,使用箱线图等方法识别可能存在的异常值,并进行修正或删除。例如,若 “销售金额” 超过正常范围(如大于均值加上 3 倍标准差),视为异常值,将其修正为合理的最大值(均值加上 3 倍标准差)。
- 数据转换:
-
- 数据类型转换:将 “销售日期” 列的数据类型从字符串转换为日期时间类型,方便后续按日期进行数据分析,如统计每日、每周、每月的销售数据。
-
- 数据格式转换:将数据从长格式转换为宽格式,以客户 ID 为行索引,产品名称为列,销售金额为对应的值,便于对比不同客户对不同产品的购买情况。
-
- 数据映射与替换:根据产品类别映射表,将 “产品名称” 列中的产品名称映射为对应的产品类别,如将 “苹果手机” 映射为 “电子产品”;同时,将 “支付方式” 列中的部分支付方式进行替换,如将 “支付宝支付” 替换为 “支付宝”。
7.3 代码实现
我们使用自然语言描述需求,借助工具生成对应的 Pandas 代码,并逐步实现上述数据清洗与转换的需求。
7.3.1 数据读取
使用提示词 “从名为 sales_data.csv 的 CSV 文件中读取电商销售数据,包含订单编号、客户 ID、产品名称、销售数量、销售金额、销售日期、支付方式等字段”,生成的 Pandas 代码如下:
import pandas as pd
# 读取CSV文件为DataFrame结构
data = pd.read_csv('sales_data.csv')
print(data.head())
上述代码中,首先导入 Pandas 库并别名为pd,然后使用read_csv函数读取sales_data.csv文件,将其存储为一个DataFrame对象,并通过head()方法查看数据的前 5 行,初步了解数据的结构和内容。运行代码后,会输出数据的前 5 行信息,如下所示(示例数据):
订单编号 客户ID 产品名称 销售数量 销售金额 销售日期 支付方式
0 001 1001 苹果手机 2 8998.0 2023-01-05 支付宝支付
1 002 1002 华为平板 1 2499.0 2023-01-06 微信支付
2 003 1001 小米手环 3 499.5 2023-01-07 银行卡支付
3 004 1003 九阳豆浆机 1 399.0 2023-01-08 支付宝支付
4 005 1002 苏泊尔电饭煲 1 299.0 2023-01-09 微信支付
7.3.2 数据清洗
- 缺失值处理:
使用提示词 “检查数据集中各列的缺失值,若‘销售金额’列缺失,直接删除该记录;若‘产品名称’列缺失,填充为‘未知’”,生成的代码如下:
# 删除“销售金额”列缺失的记录
data = data.dropna(subset=['销售金额'])
# 填充“产品名称”列缺失值为“未知”
data['产品名称'] = data['产品名称'].fillna('未知')
上述代码中,data.dropna(subset=['销售金额'])表示删除 “销售金额” 列中含有缺失值的行;data['产品名称'] = data['产品名称'].fillna('未知')表示将 “产品名称” 列中的缺失值填充为 “未知”。运行代码后,数据集中 “销售金额” 列缺失值的记录被删除,“产品名称” 列缺失值被填充为 “未知”。
- 重复值处理:
提示词为 “查找并删除数据集中的重复记录”,对应的代码为:
# 删除重复记录
data = data.drop_duplicates()
data.drop_duplicates()用于删除数据集中所有列内容都相同的重复记录,运行后,数据集中的重复记录被成功删除。
- 异常值处理:
提示词 “使用箱线图分析‘销售金额’和‘销售数量’列的数据分布,识别异常值,若‘销售金额’大于均值加上 3 倍标准差,视为异常值,修正为均值加上 3 倍标准差的值”,生成的代码如下:
import numpy as np
import matplotlib.pyplot as plt
# 分析“销售金额”列数据分布,绘制箱线图
plt.boxplot(data['销售金额'])
plt.title('Box Plot of Sales Amount')
plt.show()
# 计算“销售金额”的均值和标准差
mean_sales_amount = data['销售金额'].mean()
std_sales_amount = data['销售金额'].std()
# 识别并修正异常值
upper_bound = mean_sales_amount + 3 * std_sales_amount
data['销售金额'] = np.where(data['销售金额'] > upper_bound, upper_bound, data['销售金额'])
上述代码中,首先使用matplotlib库绘制 “销售金额” 列的箱线图,直观展示数据分布情况,方便观察是否存在异常值。然后计算 “销售金额” 的均值和标准差,通过np.where函数将大于均值加上 3 倍标准差的 “销售金额” 值修正为上限值,从而完成异常值的处理。运行代码后,会弹出箱线图窗口,展示 “销售金额” 的数据分布,同时数据集中的异常值被修正。
7.3.3 数据转换
- 数据类型转换:
提示词 “将‘销售日期’列的数据类型从字符串转换为日期时间类型”,对应的代码为:
data['销售日期'] = pd.to_datetime(data['销售日期'])
pd.to_datetime(data['销售日期'])将 “销售日期” 列中的字符串数据转换为日期时间类型,方便后续进行日期相关的计算和分析。运行代码后,“销售日期” 列的数据类型变为datetime64[ns]。
- 数据格式转换:
提示词 “将数据从长格式转换为宽格式,以客户 ID 为行索引,产品名称为列,销售金额为对应的值”,生成的代码如下:
pivot_data = data.pivot(index='客户ID', columns='产品名称', values='销售金额')
print(pivot_data.head())
data.pivot(index='客户ID', columns='产品名称', values='销售金额')以 “客户 ID” 为行索引,“产品名称” 为列,“销售金额” 为值进行数据透视,将长格式数据转换为宽格式。运行代码后,输出转换后的宽格式数据的前 5 行,示例如下:
产品名称 九阳豆浆机 华为平板 小米手环 苹果手机 苏泊尔电饭煲
客户ID
1001 NaN NaN 499.5 8998.0 NaN
1002 NaN 2499.0 NaN NaN 299.0
1003 399.0 NaN NaN NaN NaN
- 数据映射与替换:
提示词 “根据产品类别映射表,将‘产品名称’列中的产品名称映射为对应的产品类别,产品类别映射表为 {' 苹果手机 ': ' 电子产品 ', ' 华为平板 ': ' 电子产品 ', ' 小米手环 ': ' 电子产品 ', ' 九阳豆浆机 ': ' 厨房电器 ', ' 苏泊尔电饭煲 ': ' 厨房电器 '};将‘支付方式’列中的‘支付宝支付’替换为‘支付宝’”,生成的代码如下:
# 定义产品类别映射表
product_category_map = {
'苹果手机': '电子产品',
'华为平板': '电子产品',
'小米手环': '电子产品',
'九阳豆浆机': '厨房电器',
'苏泊尔电饭煲': '厨房电器'
}
# 进行产品类别映射
data['产品类别'] = data['产品名称'].map(product_category_map)
# 替换支付方式
data['支付方式'] = data['支付方式'].replace('支付宝支付', '支付宝')
print(data.head())
上述代码中,首先定义产品类别映射表product_category_map,然后使用map函数将 “产品名称” 列中的产品名称映射为对应的产品类别,生成新的 “产品类别” 列。接着,使用replace函数将 “支付方式” 列中的 “支付宝支付” 替换为 “支付宝”。运行代码后,输出数据的前 5 行,展示映射和替换后的结果,示例如下:
订单编号 客户ID 产品名称 销售数量 销售金额 销售日期 支付方式 产品类别
0 001 1001 苹果手机 2 8998.0 2023-01-05 支付宝 电子产品
1 002 1002 华为平板 1 2499.0 2023-01-06 微信支付 电子产品
2 003 1001 小米手环 3 499.5 2023-01-07 银行卡支付 电子产品
3 004 1003 九阳豆浆机 1 399.0 2023-01-08 支付宝 厨房电器
4 005 1002 苏泊尔电饭煲 1 299.0 2023-01-09 微信支付 厨房电器
通过以上步骤,我们成功使用提示词生成 Pandas 代码,实现了电商销售数据的数据清洗与转换,将原始的、存在诸多问题的数据转换为了适合分析的高质量数据,为后续的数据分析和挖掘工作奠定了坚实的基础。
八、注意事项与优化
8.1 提示词的优化技巧
在借助提示词生成 Pandas 代码的过程中,优化提示词是获取高质量、准确代码的关键。当生成的代码未能满足预期时,不要急于放弃,而是通过不断调整和优化提示词,逐步引导生成更符合需求的代码。
若最初的提示词描述过于宽泛,生成的代码可能缺乏针对性。比如提示词 “处理销售数据”,这样的表述太过笼统,模型难以理解具体的处理需求。此时,应将其细化,明确指出处理的具体操作,如 “从销售数据中筛选出销售额大于 10000 元的记录,并计算这些记录的平均销售数量”,通过增加具体的条件和操作要求,使模型能够更准确地把握需求,生成更精准的代码。
当生成的代码出现逻辑错误或不符合业务规则时,需要仔细分析错误原因,针对性地修改提示词。例如,在处理时间序列数据时,要求按月份进行数据聚合,但生成的代码却按日期聚合了。这时,需要在提示词中更加明确地强调按月份聚合,如 “将时间序列数据按月份进行分组聚合,计算每个月的销售总额”,同时可以补充一些示例数据或业务规则说明,帮助模型更好地理解需求,避免再次出现类似错误。
在优化提示词时,还可以参考一些成功的案例或已有的代码示例。比如,在处理复杂的数据透视表操作时,可以搜索相关的 Pandas 代码示例,分析其中的关键参数和操作步骤,然后将这些关键信息融入提示词中,如 “参考常见的数据透视表操作代码,将销售数据按产品类别和销售地区进行透视,行索引为产品类别,列索引为销售地区,值为销售额,并计算每个组合的销售总额和平均销售数量”,借助已有经验和示例,能够提高提示词的质量,进而生成更优质的代码。
8.2 代码性能优化
在使用 Pandas 进行数据处理时,随着数据量的不断增大,代码的性能优化显得尤为重要。优化代码性能不仅可以提高数据处理的效率,还能减少计算资源的消耗,提升整个数据分析流程的速度。
避免不必要的循环是优化代码性能的重要手段之一。在 Pandas 中,向量化操作能够充分利用底层的优化机制,实现快速的批量运算,其效率远远高于传统的 Python 循环。例如,在对 DataFrame 的某一列进行简单的数学运算时,如给 “销售额” 列每个元素乘以 1.1,使用向量化操作df['销售额'] = df['销售额'] * 1.1,要比使用循环遍历每个元素进行计算快得多。循环操作在每次迭代时都需要进行函数调用和上下文切换,而向量化操作则是在底层以更高效的方式一次性处理整个数组或 Series,大大减少了计算时间。
合理使用 Pandas 的内置函数和方法也能显著提升代码性能。比如,在处理缺失值时,使用dropna()和fillna()等内置函数,这些函数经过了高度优化,能够快速准确地完成缺失值处理任务。在进行数据筛选时,利用布尔索引df[df['年龄'] > 30]比使用循环逐一判断每个元素是否满足条件要高效得多。布尔索引通过创建一个布尔数组来筛选 DataFrame 中的行,能够充分利用 Pandas 的优化机制,实现快速的数据筛选。
对于大型数据集,合理选择数据类型可以减少内存占用,提高计算效率。Pandas 默认的数据类型可能并不总是最适合特定数据集的,例如,对于一些整数值范围较小的列,使用int8或int16类型可以比默认的int64类型节省大量内存。对于具有重复值的字符串列,可以使用category类型,category类型在内存中存储的是整数索引,而不是字符串本身,能够有效减少内存消耗,同时在进行分组、排序等操作时,也能提高计算速度。
8.3 常见问题及解决方法
在使用提示词生成代码和进行数据处理的过程中,难免会遇到各种问题。了解这些常见问题及相应的解决方法,能够帮助我们更快地解决问题,顺利完成数据处理任务。
当提示词生成的代码无法运行,提示语法错误时,首先要仔细检查代码中的拼写错误、语法结构是否正确。有时可能是因为标点符号使用不当,比如将英文逗号写成了中文逗号,或者括号不匹配等问题导致语法错误。可以逐行检查代码,对照 Pandas 的语法规则进行修正。如果问题较为复杂,难以直接找出错误,可以将报错信息复制到搜索引擎中,查看是否有其他人遇到过类似问题及相应的解决方法,许多技术论坛和社区都有丰富的资源,能够帮助我们解决语法错误问题。
在数据处理过程中,可能会遇到数据类型不匹配的问题,比如在进行数学运算时,某列的数据类型为字符串,导致运算失败。此时,需要使用astype()方法将数据类型转换为合适的类型,如df['数值列'] = df['数值列'].astype('float64'),将 “数值列” 的数据类型从字符串转换为浮点数,以满足数学运算的要求。在进行数据合并或连接操作时,也可能因为列的数据类型不一致而出现问题,同样需要先统一数据类型,再进行操作。
在处理大型数据集时,内存不足是一个常见的问题。为了解决这个问题,可以采用分块读取数据的方式,使用chunksize参数分块读取文件,逐块处理后再合并,避免一次性加载整个数据集导致内存溢出。例如,在读取大型 CSV 文件时,for chunk in pd.read_csv('large_file.csv', chunksize = 10000):,对每个数据块进行处理,减少内存占用。还可以优化数据结构,去除不必要的列,减少数据存储量,或者使用更高效的数据存储格式,如使用parquet格式代替 CSV 格式,parquet格式具有更好的压缩性能和读取速度,能够在一定程度上缓解内存压力。
九、拓展与应用
9.1 结合其他库使用
在实际的数据处理与分析工作中,Pandas 很少孤立使用,它常常与其他强大的 Python 库协同工作,以完成更复杂、多样化的任务。
NumPy 是 Python 科学计算的基础库,提供了高效的多维数组对象和丰富的数学函数。Pandas 与 NumPy 紧密结合,DataFrame 和 Series 底层的数据存储和运算很大程度上依赖于 NumPy 数组。在进行数值计算时,如对 DataFrame 中的某列数据进行复杂的数学运算,借助 NumPy 函数能显著提升效率。例如,使用 NumPy 的np.sqrt()函数计算 “销售额” 列的平方根:
import pandas as pd
import numpy as np
data = {
'销售额': [100, 225, 400]
}
df = pd.DataFrame(data)
df['销售额平方根'] = np.sqrt(df['销售额'])
print(df)
上述代码中,导入 NumPy 库后,利用np.sqrt()函数对df['销售额']进行逐元素计算,快速得到每一个销售额的平方根,并存储在新列 “销售额平方根” 中。在处理大型数据集时,NumPy 的向量化操作能避免 Python 循环的低效,大幅提高计算速度,与 Pandas 的数据处理流程无缝衔接。
Matplotlib 是 Python 最常用的数据可视化库,Pandas 与 Matplotlib 结合,可以将清洗和转换后的数据以直观、美观的图表形式呈现,帮助我们更好地理解数据特征和规律。以电商销售数据为例,我们希望绘制不同产品类别的销售总额柱状图,代码如下:
import pandas as pd
import matplotlib.pyplot as plt
# 假设已经有处理好的包含产品类别和销售额的数据
data = {
'产品类别': ['电子产品', '厨房电器', '日用品'],
'销售额': [5000, 3000, 2000]
}
df = pd.DataFrame(data)
# 绘制柱状图
df.plot(x='产品类别', y='销售额', kind='bar', title='不同产品类别的销售总额')
plt.show()
在这段代码中,首先导入 Matplotlib 库的pyplot模块并别名为plt。然后创建一个包含产品类别和销售额的 DataFrame。接着,使用 Pandas 的plot方法,指定x轴为 “产品类别”,y轴为 “销售额”,图表类型为柱状图(kind='bar'),并设置图表标题。最后通过plt.show()显示绘制好的柱状图,清晰地展示了不同产品类别的销售总额对比情况,使数据洞察更加直观。
9.2 在实际项目中的应用
Pandas 在众多实际项目中都发挥着举足轻重的作用,下面我们分享几个不同领域的应用案例。
在数据挖掘项目中,常常需要从海量的原始数据中提取有价值的信息。例如,在电商用户行为分析项目中,我们有大量的用户浏览、购买、评论等行为数据,这些数据存储在 CSV 文件中,格式多样、存在缺失值和重复值等问题。使用 Pandas 首先读取数据:
import pandas as pd
data = pd.read_csv('user_behavior.csv')
然后进行数据清洗,处理缺失值和重复值:
# 删除含有缺失值的行
data = data.dropna()
# 删除重复记录
data = data.drop_duplicates()
接着,通过数据转换,提取关键信息,如统计每个用户的购买次数:
user_purchase_count = data.groupby('用户ID')['购买记录'].count().reset_index()
user_purchase_count.rename(columns={'购买记录': '购买次数'}, inplace=True)
经过 Pandas 的数据处理后,得到了干净、有序的数据,为后续使用关联规则挖掘算法(如 Apriori 算法)分析用户购买行为模式,发现商品之间的关联关系,提供了可靠的数据基础,帮助电商企业制定更精准的营销策略,如商品推荐、组合促销等。
在机器学习项目中,数据预处理是至关重要的环节,Pandas 在其中扮演着不可或缺的角色。以房价预测项目为例,我们从各种数据源获取房屋信息数据,包括房屋面积、卧室数量、房龄、价格等。这些数据可能存在数据类型不一致、异常值等问题。使用 Pandas 进行数据类型转换,将 “房龄” 列的数据类型从字符串转换为数值类型:
data['房龄'] = pd.to_numeric(data['房龄'], errors='coerce')
处理异常值,使用箱线图识别 “价格” 列的异常值并进行修正:
import numpy as np
import matplotlib.pyplot as plt
# 绘制箱线图
plt.boxplot(data['价格'])
plt.title('Box Plot of House Price')
plt.show()
# 计算“价格”的均值和标准差
mean_price = data['价格'].mean()
std_price = data['价格'].std()
# 识别并修正异常值
upper_bound = mean_price + 3 * std_price
data['价格'] = np.where(data['价格'] > upper_bound, upper_bound, data['价格'])
经过 Pandas 的数据预处理后,数据质量得到提升,能够更好地满足机器学习模型的输入要求,为训练准确的房价预测模型,如线性回归模型、决策树模型等,提供了高质量的数据,提高了模型的预测精度和稳定性。
在商业分析领域,Pandas 同样大显身手。例如,在一家零售企业的销售数据分析项目中,企业拥有多个门店的销售数据,存储在 Excel 文件中,需要对这些数据进行整合、分析,以制定销售策略。使用 Pandas 读取多个 Excel 文件的数据,并进行合并:
import pandas as pd
file_paths = ['store1_sales.xlsx','store2_sales.xlsx','store3_sales.xlsx']
dfs = []
for path in file_paths:
df = pd.read_excel(path)
dfs.append(df)
merged_data = pd.concat(dfs)
然后进行数据转换,按门店和月份统计销售总额:
merged_data['销售日期'] = pd.to_datetime(merged_data['销售日期'])
merged_data['月份'] = merged_data['销售日期'].dt.month
sales_summary = merged_data.groupby(['门店', '月份'])['销售金额'].sum().reset_index()
通过 Pandas 的这些操作,得到了按门店和月份统计的销售总额数据,企业可以根据这些数据进行销售趋势分析,找出销售旺季和淡季,以及各门店的销售表现,从而合理安排库存、制定促销活动,提高企业的销售业绩和利润。

14万+

被折叠的 条评论
为什么被折叠?



