Pandas表格处理完整实战教程(从入门到生产大数据落地)

📅 2026/7/13 6:01:38 👁️ 阅读次数 📝 编程学习
Pandas表格处理完整实战教程(从入门到生产大数据落地)

文章目录

    • 一、环境安装与基础数据结构
      • 1. 安装依赖
      • 2. 两大核心结构:Series、DataFrame
        • Series:一维序列(单列数据)
        • DataFrame:二维表格(日常99%场景使用)
    • 二、文件读写:CSV/Excel/Parquet全场景
      • 1. 读取文件
        • 读取CSV(日志、订单数据主流格式)
        • 读取Excel报表
        • Parquet二进制格式(大数据生产首选)
      • 2. 导出保存文件
    • 三、数据快速探查:拿到文件第一步操作
    • 四、表格增删改查:行、列操作大全
      • 1. 列操作(新增、删除、重命名、选取)
        • 选取单列/多列
        • 新增计算列
        • 重命名列
        • 删除列
      • 2. 行操作:筛选、删除、抽样、排序
        • 基础条件筛选
        • 索引取值 loc/iloc(精准定位修改)
        • 排序
        • 随机抽样
      • 3. 合并表格:concat、merge
        • 纵向拼接(追加行,上下合并)
        • 横向关联(类似SQL join,业务最常用)
    • 五、数据清洗:处理缺失值、重复、异常脏数据
      • 1. 缺失值处理 NaN
      • 2. 重复值清理
      • 3. 异常数值过滤
    • 六、分组聚合、透视表(报表统计核心)
      • 1. groupby分组统计
      • 2. transform组内计算(保留原表行数)
      • 3. pivot_table透视表(Excel数据透视表等价)
    • 七、日期、文本专项处理
      • 1. 日期处理 .dt访问器
      • 2. 文本字符串处理 str
    • 八、大数据生产性能优化(百万/千万行必备)
      • 1. 读取阶段优化
      • 2. 禁止低效遍历
      • 3. 内存释放
      • 4. groupby提速
    • 九、生产环境常见报错与避坑清单
    • 十、完整业务实战案例:电商订单数据全流程处理

本文基于多年业务报表、数仓前置清洗、线上数据导出真实经验整理,从基础安装、DataFrame基础操作、数据清洗、分组聚合、多表合并、日期文本处理、大数据性能优化、生产避坑、完整业务实战案例全覆盖,所有代码均本地实测可直接运行,无空泛理论,适合运营、测试、后端开发自学,也可作为企业内部数据处理技术文档,关键词布局适配搜索引擎收录。

一、环境安装与基础数据结构

1. 安装依赖

Python3.7及以上版本支持,执行pip安装,处理Excel额外装openpyxl:

# 核心库pipinstallpandas# Excel读写依赖pipinstallopenpyxl

导入固定写法,行业通用规范:

importpandasaspdimportnumpyasnp

2. 两大核心结构:Series、DataFrame

Series:一维序列(单列数据)
# 创建序列s=pd.Series([88,92,76,90],index=["张三","李四","王五","赵六"],name="分数")print(s)# 取值print(s["张三"])
DataFrame:二维表格(日常99%场景使用)

字典转表格是最常用创建方式,模拟员工表数据:

data={"员工ID":[101,102,103,104,105],"姓名":["张三","李四","王五","赵六","钱七"],"部门":["技术部","市场部","技术部","人事部","市场部"],"薪资":[12000,9500,15000,8200,9800],"入职日期":["2021-03-12","2020-07-05","2019-11-20","2022-01-15","2020-09-08"]}df=pd.DataFrame(data)print(df)

二、文件读写:CSV/Excel/Parquet全场景

1. 读取文件

读取CSV(日志、订单数据主流格式)
# 基础读取df=pd.read_csv("order.csv",encoding="utf-8")# 优化参数:只加载需要的列、指定类型、自动解析日期df=pd.read_csv("order.csv",usecols=["订单号","下单时间","金额","用户ID"],# 仅读取指定列,节省内存dtype={"用户ID":"int32","金额":"float32"},parse_dates=["下单时间"]# 自动转为日期格式)# 分块读取大文件(百万行以上必用)chunk_reader=pd.read_csv("big_data.csv",chunksize=50000)forchunkinchunk_reader:# 逐块处理逻辑pass
读取Excel报表
# 读取单sheetdf=pd.read_excel("员工信息.xlsx",sheet_name="Sheet1")# 指定表头行、跳过空行df=pd.read_excel("报表.xlsx",header=1,skiprows=[0])
Parquet二进制格式(大数据生产首选)

读写速度远超CSV,压缩率高,推荐存储中间处理结果:

df=pd.read_parquet("data.parquet")

2. 导出保存文件

# 导出CSV,index=False不输出行索引df.to_csv("result.csv",index=False,encoding="utf-8-sig")# 导出Exceldf.to_excel("输出报表.xlsx",sheet_name="统计结果",index=False)# 二进制存储df.to_parquet("data_out.parquet",index=False)

三、数据快速探查:拿到文件第一步操作

拿到原始数据先探查结构,快速定位缺失、异常、类型错误,生产标准流程:

# 查看前5行print(df.head())# 查看末尾3行print(df.tail(3))# 表格行列尺寸print(df.shape)# 字段类型、缺失值总览(最常用)df.info()# 数值列统计:均值、最大最小、分位数print(df.describe())# 单列唯一值,查看分类字段print(df["部门"].unique())# 分类字段计数print(df["部门"].value_counts())# 每列缺失值数量print(df.isnull().sum())

四、表格增删改查:行、列操作大全

1. 列操作(新增、删除、重命名、选取)

选取单列/多列
# 单列df["姓名"]# 多列,双括号df[["姓名","部门","薪资"]]
新增计算列
# 统一加绩效奖金df["实发薪资"]=df["薪资"]+1500# 按行多列求和、求平均df["基础收入"]=df[["薪资"]].sum(axis=1)# 条件新增列df["薪资等级"]=np.where(df["薪资"]>10000,"高薪","普通")
重命名列
df=df.rename(columns={"员工ID":"id","入职日期":"entry_date"})
删除列
# 删除指定多列df=df.drop(columns=["实发薪资","薪资等级"])

2. 行操作:筛选、删除、抽样、排序

基础条件筛选
# 单条件:技术部员工tech_df=df[df["部门"]=="技术部"]# 多条件 且 &、或 |,每个条件必须加括号high_salary=df[(df["薪资"]>10000)&(df["部门"]=="技术部")]# 模糊匹配,文本包含market_df=df[df["姓名"].str.contains("四",na=False)]# query简洁筛选(可读性更高)res=df.query("薪资 > 9000 and 部门 == '市场部'")
索引取值 loc/iloc(精准定位修改)
  • loc:按标签、列名筛选
  • iloc:按数字下标筛选
# 第0-3行,姓名、薪资两列df.loc[0:3,["姓名","薪资"]]# 前4行,前3列(数字下标)df.iloc[:4,:3]# 条件定位修改数据df.loc[df["姓名"]=="李四","薪资"]=10200
排序
# 薪资降序df_sort=df.sort_values("薪资",ascending=False)# 多字段排序:部门升序、薪资降序df_sort=df.sort_values(["部门","薪资"],ascending=[True,False])
随机抽样
# 随机抽取3行sample=df.sample(n=3)# 抽取30%数据sample=df.sample(frac=0.3)

3. 合并表格:concat、merge

纵向拼接(追加行,上下合并)
df1=df[df["部门"]=="技术部"]df2=df[df["部门"]=="市场部"]df_all=pd.concat([df1,df2],ignore_index=True)
横向关联(类似SQL join,业务最常用)

模拟员工表+部门薪资标准表,按公共字段员工ID左连接:

dept_data={"部门":["技术部","市场部","人事部"],"基础绩效":[2000,1200,800]}dept_df=pd.DataFrame(dept_data)# left左连接,保留左表全部数据df_merge=df.merge(dept_df,on="部门",how="left")# how可选 inner/left/right/outer

五、数据清洗:处理缺失值、重复、异常脏数据

真实业务数据80%工作量在清洗,是生产核心模块。

1. 缺失值处理 NaN

# 统计每列缺失数量df.isnull().sum()# 1. 删除缺失# 删除任意列有空值的行df.dropna()# 仅删除薪资为空的行df.dropna(subset=["薪资"])# 删除缺失超过3列的行df.dropna(thresh=len(df.columns)-3)# 2. 填充缺失值# 全部填充0df["薪资"].fillna(0)# 文本填充未知df["部门"].fillna("未知部门")# 数值用中位数填充(避免极值干扰均值)df["薪资"].fillna(df["薪资"].median())# 字典多列分别填充fill_map={"薪资":0,"部门":"未知"}df.fillna(fill_map)# 前向填充(时间序列专用)df.fillna(method="ffill")

2. 重复值清理

# 查看重复行数print(df.duplicated().sum())# 整行重复删除df=df.drop_duplicates()# 指定字段去重,保留第一条df=df.drop_duplicates(subset=["员工ID"],keep="first")

3. 异常数值过滤

过滤负数金额、极端超大值脏数据:

# 薪资小于0的异常行删除df=df[df["薪资"]>=0]# 剔除上下1%极值q1=df["薪资"].quantile(0.01)q99=df["薪资"].quantile(0.99)df=df[(df["薪资"]>=q1)&(df["薪资"]<=q99)]

六、分组聚合、透视表(报表统计核心)

1. groupby分组统计

# 单分组:各部门平均薪资dept_salary=df.groupby("部门")["薪资"].mean()# 多重分组:部门+薪资等级,多聚合函数stat=df.groupby(["部门","薪资等级"]).agg(人数=("员工ID","count"),平均薪资=("薪资","mean"),最高薪资=("薪资","max"),总薪资=("薪资","sum")).reset_index()# reset_index将分组字段变回普通列# 大数据优化:sort=False关闭默认排序,提速50%stat=df.groupby("部门",sort=False)["薪资"].sum()

2. transform组内计算(保留原表行数)

常用于计算每组占比、组内排名,不会压缩行数:

# 每个员工薪资占本部门总薪资比例df["部门薪资总和"]=df.groupby("部门")["薪资"].transform("sum")df["部门薪资占比"]=df["薪资"]/df["部门薪资总和"]# 组内薪资排名df["组内排名"]=df.groupby("部门")["薪资"].rank(ascending=False)

3. pivot_table透视表(Excel数据透视表等价)

快速生成交叉统计报表,适合月度、渠道多维报表:

pivot=pd.pivot_table(df,values="薪资",index="部门",columns="薪资等级",aggfunc=["mean","count"],fill_value=0)

七、日期、文本专项处理

1. 日期处理 .dt访问器

# 字符串转日期df["入职日期"]=pd.to_datetime(df["入职日期"])# 提取年、月、日、季度df["入职年份"]=df["入职日期"].dt.year df["入职月份"]=df["入职日期"].dt.month df["季度"]=df["入职日期"].dt.quarter# 筛选2020年入职员工df_2020=df[df["入职日期"].dt.year==2020]# 计算入职年限df["入职年限"]=(pd.Timestamp.now()-df["入职日期"]).dt.days//365

2. 文本字符串处理 str

# 转小写、大写df["姓名"].str.lower()# 判断是否包含指定字符df["姓名"].str.contains("三")# 文本分割df["姓名"].str.split("三",expand=True)# 去除首尾空格df["部门"]=df["部门"].str.strip()

八、大数据生产性能优化(百万/千万行必备)

本地小文件看不出性能差异,线上日志、订单大表不优化会出现内存溢出、脚本超时。

1. 读取阶段优化

  1. usecols只加载业务需要的列,减少IO与内存占用
  2. dtype指定数值类型,int64改为int32,float64改float32
  3. 分类字段转category(部门、渠道、状态),内存压缩80%以上
df["部门"]=df["部门"].astype("category")
  1. 超大文件使用chunksize分块循环处理,避免一次性加载进内存

2. 禁止低效遍历

  • 不要用iterrows循环,百万行极度卡顿
  • 优先使用向量化运算、query、eval替代循环if判断
  • 批量新增行不要循环append,先存列表最后一次concat

3. 内存释放

中间无用DataFrame及时删除,手动回收内存:

importgcdeltemp_df gc.collect()

4. groupby提速

分组时添加sort=False,关闭默认排序;聚合优先单字段分组,减少多维度嵌套。

九、生产环境常见报错与避坑清单

  1. 中文CSV乱码
    导出使用encoding="utf-8-sig",读取报错切换gbk编码。
  2. 循环遍历百万行缓慢
    放弃iterrows,改用向量化、transform、query表达式。
  3. 内存占用过高程序崩溃
    分类列转category、分块读取、指定dtype、及时删除中间变量。
  4. merge关联后数据行数异常增多
    关联字段存在重复值,提前用drop_duplicates清理主键。
  5. 日期转换失败
    混合异常文本时加errors=“coerce”,非法日期转为NaT:
    pd.to_datetime(df["日期"], errors="coerce")
  6. inplace=True慎用
    会直接修改原表,调试时难以回退,推荐赋值新变量。
  7. groupby分组顺序错乱
    大数据场景添加sort=False,不影响业务无需排序。
  8. 缺失值参与计算结果全为NaN
    数值列提前fillna填充,或筛选剔除缺失行再聚合。

十、完整业务实战案例:电商订单数据全流程处理

需求:读取月度订单CSV,清洗脏数据,统计各渠道月度销售额、订单量,导出报表

importpandasaspd# 1. 读取数据,优化加载参数df=pd.read_csv("month_order.csv",usecols=["order_id","order_time","channel","amount","pay_status"],dtype={"amount":"float32","channel":"category"},parse_dates=["order_time"])# 2. 数据清洗# 剔除金额负数、未支付订单df=df[(df["amount"]>0)&(df["pay_status"]=="已支付")]# 删除重复订单df=df.drop_duplicates(subset=["order_id"])# 提取年月df["year_month"]=df["order_time"].dt.to_period("M")# 3. 分组统计report=df.groupby(["year_month","channel"],sort=False).agg(订单总数=("order_id","count"),销售总额=("amount","sum"),客单价=("amount","mean")).reset_index()# 4. 导出报表report.to_excel("渠道月度销售报表.xlsx",sheet_name="统计结果",index=False)print("报表生成完成")