从零开始学 Pandas:数据处理核心操作指南
目录
一、数据的导入与导出:数据处理的第一步
1. 读取不同格式的文件
2. 数据导出
二、数据清洗:让数据更 \"干净\"
1. 缺失值处理
2. 重复值处理
三、数据抽取与转换:精准获取所需信息
1. 条件抽取
2. 字符串截取:slice 函数
3. 数据计算
四、数据合并:整合多源信息
1. 列的合并
2. 数据框的合并
五、高级处理:抽样、标准化与分组
1. 随机抽样
2. 数据标准化
3. 数据分组
在数据分析领域,Pandas 库无疑是 Python 生态中最强大的工具之一。它以简洁的语法和高效的性能,成为数据清洗、转换、分析的首选工具。本文将结合实际代码案例,带你系统学习 Pandas 的核心操作,从数据导入到高级处理,逐步掌握数据处理的全流程。
一、数据的导入与导出:数据处理的第一步
任何数据分析都始于数据的获取,Pandas 提供了丰富的函数支持多种格式文件的读写,让数据导入导出变得简单高效。
1. 读取不同格式的文件
- CSV 文件:使用
read_csv
函数,支持指定编码(如utf-8
、gbk
)和引擎参数。当数据包含中文时,encoding=\'gbk\'
是常见选择。import pandas as pd# 读取带表头的CSVdf1 = pd.read_csv(\"data1.csv\")# 读取无表头的CSV(指定header=None)df2 = pd.read_csv(\"data2.csv\", encoding=\'utf8\', engine=\'python\', header=None)
- Excel 文件:通过
read_excel
直接读取.xlsx 文件:df3 = pd.read_excel(\"data3.xlsx\")
- TXT 文件:使用
read_table
,需指定分隔符(如逗号分隔的 txt 可用sep=\',\'
):df4 = pd.read_table(\"data4.txt\", sep=\',\', header=None)
2. 数据导出
处理完成的数据可通过to_csv
和to_excel
导出,index
和header
参数控制是否保留行索引和列名:
# 导出为CSVdf1.to_csv(\"导出.csv\", index=True, header=True)# 导出为Exceldf1.to_excel(\"导出.xlsx\", index=True, header=True)
二、数据清洗:让数据更 \"干净\"
原始数据往往存在缺失值、重复值等问题,直接分析会导致结果偏差。Pandas 提供了针对性的处理工具,让数据清洗事半功倍。
1. 缺失值处理
缺失值是数据中最常见的问题,Pandas 提供了三种核心处理思路:
-
识别缺失值:用
isnull()
判断空值位置,结合any(axis=1)
可定位包含空值的行:# 判断空值位置na = df.isnull()# 提取含空值的行df[na.any(axis=1)]# 提取特定列含空值的行(如gender列)df[na[[\'gender\']].any(axis=1)]
-
填充缺失值:使用
fillna
用指定值(如字符串、数值)填充空值:# 用\'1\'填充所有缺失值df1 = df.fillna(\'1\')
-
删除缺失值:通过
dropna
删除包含空值的行(默认删除任何含空值的行):# 删除所有含空值的行df2 = df.dropna()
2. 重复值处理
重复数据会干扰分析结果,需先识别再处理:
-
识别重复值:
duplicated()
返回布尔值判断是否重复,支持按特定列判断:# 判断全行重复result1 = df.duplicated()# 按gender列判断重复result2 = df.duplicated(\'gender\')# 按gender和name列联合判断重复result3 = df.duplicated([\'gender\', \'name\'])
-
删除重复值:
drop_duplicates
可删除重复行,同样支持按列筛选:# 删除全行重复的行new_df1 = df.drop_duplicates()# 按name和gender列删除重复行new_df2 = df.drop_duplicates([\'name\', \'gender\'])
三、数据抽取与转换:精准获取所需信息
数据清洗后,需根据分析目标抽取关键信息,或对数据进行转换处理。
1. 条件抽取
通过逻辑判断筛选符合条件的数据,是数据分析的基础操作:
-
比较运算:如筛选好评数大于 17000 的记录,或在某个区间内的记录:
# 好评数>17000df[df[\'好评数\'] > 17000]# 好评数在15000-17000之间df[df[\'好评数\'].between(15000, 17000)]
-
字符匹配:用
str.contains
筛选包含特定字符的记录(na=False
忽略空值):# 筛选品牌含\"苹果\"的记录df[df[\'品牌\'].str.contains(\'苹果\', na=False)]
-
逻辑运算:结合
&
(且)、|
(或)实现多条件筛选:# 价格16000df[(df[\'价格\'] 16000)]
2. 字符串截取:slice 函数
对字符串类型数据,可通过str.slice
截取指定位置的字符,例如从身份证号中提取信息:
# 将id转为字符串类型(避免数值截取错误)df[\'id\'] = df[\'id\'].astype(str)# 提取前6位(地址码)area = df[\'id\'].str.slice(0, 6)# 提取6-14位(出生日期码)birthday = df[\'id\'].str.slice(6, 14)
3. 数据计算
Pandas 支持直接对列进行算术运算,快速生成新指标:
# 计算总价(单价×数量)df[\'总价\'] = df[\'单价\'] * df[\'数量\']
四、数据合并:整合多源信息
实际分析中,数据往往分散在多个表格中,需通过合并操作整合为完整数据集。
1. 列的合并
通过+
直接拼接多个列,生成新列(需确保列类型一致,通常转为字符串):
# 将area、birthday等列拼接为iddf = df.astype(str)df[\'id\'] = df[\'area\'] + df[\'birthday\'] + df[\'ranking\'] + df[\'only\']
2. 数据框的合并
-
concat 函数:支持横向(
axis=1
)或竖向(默认axis=0
)合并,join
参数控制交集(inner
)或并集(outer
):# 竖向合并(行拼接)new_df1 = pd.concat([df2, df1])# 横向合并(列拼接),取交集new_df3 = pd.concat([df1, df3], axis=1, join=\'inner\')
-
merge 函数:按指定键(如姓名)合并,支持内连接、左连接、右连接、外连接:
# 按name内连接(仅保留双方都有的name)df3 = pd.merge(df1, df2, left_on=\'name\', right_on=\'name\')# 左连接(保留df1所有name)df4 = pd.merge(df1, df2, left_on=\'name\', right_on=\'name\', how=\'left\')
五、高级处理:抽样、标准化与分组
1. 随机抽样
通过sample
函数实现随机抽样,支持按个数(n
)或比例(frac
)抽样,replace
控制是否有放回:
import numpy as np# 设置随机种子(保证结果可复现)np.random.seed(seed=2)# 按个数不放回抽样(10条)df.sample(n=10)# 按比例有放回抽样(20%)new_df = df.sample(frac=0.2, replace=True)
2. 数据标准化
为消除不同指标的量纲影响,需进行标准化处理,常见方法有:
-
0~1 标准化:将数据映射到 [0,1] 区间:
# 国内生产总值0~1标准化df1[\'国内生产总值0~1标准化\'] = round( (df1.国内生产总值 - df1.国内生产总值.min()) / (df1.国内生产总值.max() - df1.国内生产总值.min()), 2)
-
Z 标准化:将数据转换为均值为 0、方差为 1 的分布:
# 国内生产总值Z标准化df1[\'国内生产总值Z标准化\'] = round( (df1.国内生产总值 - df1.国内生产总值.mean()) / df1.国内生产总值.std(), 2)
3. 数据分组
用cut
函数将连续数据离散化(分组),需指定分组边界(bins
)和标签(labels
):
# 定义人均GDP分组边界bins = [min(df.人均GDP)-1, 2000, 4000, 6000, 8000, max(df.人均GDP)+1]# 自定义分组标签labels = [\'2000以下\', \'2001~4000\', \'4001~6000\', \'6001~8000\', \'8000以上\']# 分组并添加到数据框df[\'人均GDP分组\'] = pd.cut(df.人均GDP, bins, labels=labels)