)
文章目录一、环境安装与基础数据结构1. 安装依赖2. 两大核心结构Series、DataFrameSeries一维序列单列数据DataFrame二维表格日常99%场景使用二、文件读写CSV/Excel/Parquet全场景1. 读取文件读取CSV日志、订单数据主流格式读取Excel报表Parquet二进制格式大数据生产首选2. 导出保存文件三、数据快速探查拿到文件第一步操作四、表格增删改查行、列操作大全1. 列操作新增、删除、重命名、选取选取单列/多列新增计算列重命名列删除列2. 行操作筛选、删除、抽样、排序基础条件筛选索引取值 loc/iloc精准定位修改排序随机抽样3. 合并表格concat、merge纵向拼接追加行上下合并横向关联类似SQL join业务最常用五、数据清洗处理缺失值、重复、异常脏数据1. 缺失值处理 NaN2. 重复值清理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导入固定写法行业通用规范importpandasaspdimportnumpyasnp2. 两大核心结构Series、DataFrameSeries一维序列单列数据# 创建序列spd.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]}dfpd.DataFrame(data)print(df)二、文件读写CSV/Excel/Parquet全场景1. 读取文件读取CSV日志、订单数据主流格式# 基础读取dfpd.read_csv(order.csv,encodingutf-8)# 优化参数只加载需要的列、指定类型、自动解析日期dfpd.read_csv(order.csv,usecols[订单号,下单时间,金额,用户ID],# 仅读取指定列节省内存dtype{用户ID:int32,金额:float32},parse_dates[下单时间]# 自动转为日期格式)# 分块读取大文件百万行以上必用chunk_readerpd.read_csv(big_data.csv,chunksize50000)forchunkinchunk_reader:# 逐块处理逻辑pass读取Excel报表# 读取单sheetdfpd.read_excel(员工信息.xlsx,sheet_nameSheet1)# 指定表头行、跳过空行dfpd.read_excel(报表.xlsx,header1,skiprows[0])Parquet二进制格式大数据生产首选读写速度远超CSV压缩率高推荐存储中间处理结果dfpd.read_parquet(data.parquet)2. 导出保存文件# 导出CSVindexFalse不输出行索引df.to_csv(result.csv,indexFalse,encodingutf-8-sig)# 导出Exceldf.to_excel(输出报表.xlsx,sheet_name统计结果,indexFalse)# 二进制存储df.to_parquet(data_out.parquet,indexFalse)三、数据快速探查拿到文件第一步操作拿到原始数据先探查结构快速定位缺失、异常、类型错误生产标准流程# 查看前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(axis1)# 条件新增列df[薪资等级]np.where(df[薪资]10000,高薪,普通)重命名列dfdf.rename(columns{员工ID:id,入职日期:entry_date})删除列# 删除指定多列dfdf.drop(columns[实发薪资,薪资等级])2. 行操作筛选、删除、抽样、排序基础条件筛选# 单条件技术部员工tech_dfdf[df[部门]技术部]# 多条件 且 、或 |每个条件必须加括号high_salarydf[(df[薪资]10000)(df[部门]技术部)]# 模糊匹配文本包含market_dfdf[df[姓名].str.contains(四,naFalse)]# query简洁筛选可读性更高resdf.query(薪资 9000 and 部门 市场部)索引取值 loc/iloc精准定位修改loc按标签、列名筛选iloc按数字下标筛选# 第0-3行姓名、薪资两列df.loc[0:3,[姓名,薪资]]# 前4行前3列数字下标df.iloc[:4,:3]# 条件定位修改数据df.loc[df[姓名]李四,薪资]10200排序# 薪资降序df_sortdf.sort_values(薪资,ascendingFalse)# 多字段排序部门升序、薪资降序df_sortdf.sort_values([部门,薪资],ascending[True,False])随机抽样# 随机抽取3行sampledf.sample(n3)# 抽取30%数据sampledf.sample(frac0.3)3. 合并表格concat、merge纵向拼接追加行上下合并df1df[df[部门]技术部]df2df[df[部门]市场部]df_allpd.concat([df1,df2],ignore_indexTrue)横向关联类似SQL join业务最常用模拟员工表部门薪资标准表按公共字段员工ID左连接dept_data{部门:[技术部,市场部,人事部],基础绩效:[2000,1200,800]}dept_dfpd.DataFrame(dept_data)# left左连接保留左表全部数据df_mergedf.merge(dept_df,on部门,howleft)# how可选 inner/left/right/outer五、数据清洗处理缺失值、重复、异常脏数据真实业务数据80%工作量在清洗是生产核心模块。1. 缺失值处理 NaN# 统计每列缺失数量df.isnull().sum()# 1. 删除缺失# 删除任意列有空值的行df.dropna()# 仅删除薪资为空的行df.dropna(subset[薪资])# 删除缺失超过3列的行df.dropna(threshlen(df.columns)-3)# 2. 填充缺失值# 全部填充0df[薪资].fillna(0)# 文本填充未知df[部门].fillna(未知部门)# 数值用中位数填充避免极值干扰均值df[薪资].fillna(df[薪资].median())# 字典多列分别填充fill_map{薪资:0,部门:未知}df.fillna(fill_map)# 前向填充时间序列专用df.fillna(methodffill)2. 重复值清理# 查看重复行数print(df.duplicated().sum())# 整行重复删除dfdf.drop_duplicates()# 指定字段去重保留第一条dfdf.drop_duplicates(subset[员工ID],keepfirst)3. 异常数值过滤过滤负数金额、极端超大值脏数据# 薪资小于0的异常行删除dfdf[df[薪资]0]# 剔除上下1%极值q1df[薪资].quantile(0.01)q99df[薪资].quantile(0.99)dfdf[(df[薪资]q1)(df[薪资]q99)]六、分组聚合、透视表报表统计核心1. groupby分组统计# 单分组各部门平均薪资dept_salarydf.groupby(部门)[薪资].mean()# 多重分组部门薪资等级多聚合函数statdf.groupby([部门,薪资等级]).agg(人数(员工ID,count),平均薪资(薪资,mean),最高薪资(薪资,max),总薪资(薪资,sum)).reset_index()# reset_index将分组字段变回普通列# 大数据优化sortFalse关闭默认排序提速50%statdf.groupby(部门,sortFalse)[薪资].sum()2. transform组内计算保留原表行数常用于计算每组占比、组内排名不会压缩行数# 每个员工薪资占本部门总薪资比例df[部门薪资总和]df.groupby(部门)[薪资].transform(sum)df[部门薪资占比]df[薪资]/df[部门薪资总和]# 组内薪资排名df[组内排名]df.groupby(部门)[薪资].rank(ascendingFalse)3. pivot_table透视表Excel数据透视表等价快速生成交叉统计报表适合月度、渠道多维报表pivotpd.pivot_table(df,values薪资,index部门,columns薪资等级,aggfunc[mean,count],fill_value0)七、日期、文本专项处理1. 日期处理 .dt访问器# 字符串转日期df[入职日期]pd.to_datetime(df[入职日期])# 提取年、月、日、季度df[入职年份]df[入职日期].dt.year df[入职月份]df[入职日期].dt.month df[季度]df[入职日期].dt.quarter# 筛选2020年入职员工df_2020df[df[入职日期].dt.year2020]# 计算入职年限df[入职年限](pd.Timestamp.now()-df[入职日期]).dt.days//3652. 文本字符串处理 str# 转小写、大写df[姓名].str.lower()# 判断是否包含指定字符df[姓名].str.contains(三)# 文本分割df[姓名].str.split(三,expandTrue)# 去除首尾空格df[部门]df[部门].str.strip()八、大数据生产性能优化百万/千万行必备本地小文件看不出性能差异线上日志、订单大表不优化会出现内存溢出、脚本超时。1. 读取阶段优化usecols只加载业务需要的列减少IO与内存占用dtype指定数值类型int64改为int32float64改float32分类字段转category部门、渠道、状态内存压缩80%以上df[部门]df[部门].astype(category)超大文件使用chunksize分块循环处理避免一次性加载进内存2. 禁止低效遍历不要用iterrows循环百万行极度卡顿优先使用向量化运算、query、eval替代循环if判断批量新增行不要循环append先存列表最后一次concat3. 内存释放中间无用DataFrame及时删除手动回收内存importgcdeltemp_df gc.collect()4. groupby提速分组时添加sortFalse关闭默认排序聚合优先单字段分组减少多维度嵌套。九、生产环境常见报错与避坑清单中文CSV乱码导出使用encodingutf-8-sig读取报错切换gbk编码。循环遍历百万行缓慢放弃iterrows改用向量化、transform、query表达式。内存占用过高程序崩溃分类列转category、分块读取、指定dtype、及时删除中间变量。merge关联后数据行数异常增多关联字段存在重复值提前用drop_duplicates清理主键。日期转换失败混合异常文本时加errors“coerce”非法日期转为NaTpd.to_datetime(df[日期], errorscoerce)inplaceTrue慎用会直接修改原表调试时难以回退推荐赋值新变量。groupby分组顺序错乱大数据场景添加sortFalse不影响业务无需排序。缺失值参与计算结果全为NaN数值列提前fillna填充或筛选剔除缺失行再聚合。十、完整业务实战案例电商订单数据全流程处理需求读取月度订单CSV清洗脏数据统计各渠道月度销售额、订单量导出报表importpandasaspd# 1. 读取数据优化加载参数dfpd.read_csv(month_order.csv,usecols[order_id,order_time,channel,amount,pay_status],dtype{amount:float32,channel:category},parse_dates[order_time])# 2. 数据清洗# 剔除金额负数、未支付订单dfdf[(df[amount]0)(df[pay_status]已支付)]# 删除重复订单dfdf.drop_duplicates(subset[order_id])# 提取年月df[year_month]df[order_time].dt.to_period(M)# 3. 分组统计reportdf.groupby([year_month,channel],sortFalse).agg(订单总数(order_id,count),销售总额(amount,sum),客单价(amount,mean)).reset_index()# 4. 导出报表report.to_excel(渠道月度销售报表.xlsx,sheet_name统计结果,indexFalse)print(报表生成完成)