Pandas 数据处理进阶缺失值、合并、分组聚合与透视表在完成 pandas 的基础操作索引、筛选、赋值、函数应用之后下一步便是处理真实数据中常见的问题缺失值、多表合并、分组统计以及数据透视。本文带你系统掌握这些核心技能并提供可直接运行的代码示例。目录数据清洗缺失值处理1.1 检测缺失值1.2 删除缺失值1.3 填充缺失值1.4 自定义替换为 NaN数据合并concat 与 merge2.1 concat轴向拼接2.2 merge键值关联2.3 join基于索引的合并分组与聚合groupby 的威力3.1 基础分组3.2 多列分组3.3 聚合函数 agg3.4 过滤与变换透视表与交叉表4.1 交叉表 crosstab频数统计4.2 透视表 pivot_table灵活聚合4.3 多级透视综合实战电商订单数据分析小结与进阶建议1. 数据清洗缺失值处理真实数据往往不完整pandas 提供了丰富的缺失值处理工具。1.1 检测缺失值isna()/isnull()返回布尔型 DataFrameTrue 表示缺失。isna().any(axis?)检查每列/行是否有缺失。isna().sum()统计每列缺失数量。importpandasaspdimportnumpyasnp dfpd.DataFrame({A:[1,2,np.nan,4],B:[5,np.nan,np.nan,8],C:[9,10,11,12]})print(df.isna())print(df.isna().any())# 每列是否有缺失print(df.isna().sum())# 每列缺失个数1.2 删除缺失值dropna# 删除任何含有缺失值的行df_cleandf.dropna()# 删除任何含有缺失值的列df_cleandf.dropna(axis1)# 仅当某列全部缺失时才删除df_cleandf.dropna(howall)# 指定 subset仅检查特定列df_cleandf.dropna(subset[A,B])1.3 填充缺失值fillna# 用常数填充df_filleddf.fillna(0)# 用前一个值填充向前填充df_filleddf.fillna(methodffill)# 用后一个值填充df_filleddf.fillna(methodbfill)# 针对不同列用不同值df_filleddf.fillna({A:0,B:df[B].mean()})1.4 自定义替换为 NaN某些数据中特殊值如N/A、-1、0应视为缺失。dfdf.replace({N/A:np.nan,-1:np.nan,0:np.nan})# 或原地修改df.replace({N/A:np.nan,0:np.nan},inplaceTrue)2. 数据合并concat 与 merge2.1concat轴向拼接axis0纵向拼接上下堆叠要求列名一致。axis1横向拼接左右并排要求行索引对齐。ignore_indexTrue重置索引。df1pd.DataFrame({A:[1,2],B:[3,4]})df2pd.DataFrame({A:[5,6],B:[7,8]})# 纵向拼接df_verticalpd.concat([df1,df2],axis0,ignore_indexTrue)# 横向拼接df_horizontalpd.concat([df1,df2],axis1)2.2merge键值关联类似 SQL JOINleftpd.DataFrame({key:[X,Y,Z],value_left:[1,2,3]})rightpd.DataFrame({key:[X,Y,W],value_right:[4,5,6]})# 内连接默认innerpd.merge(left,right,onkey,howinner)# 左连接left_joinpd.merge(left,right,onkey,howleft)# 右连接right_joinpd.merge(left,right,onkey,howright)# 外连接全连接outerpd.merge(left,right,onkey,howouter)# 多列关联on[col1, col2]# 处理重复列名suffixes(_x, _y)2.3join基于索引的合并leftpd.DataFrame({A:[1,2]},index[a,b])rightpd.DataFrame({B:[3,4]},index[a,c])resultleft.join(right,howleft)# 默认左连接基于索引3. 分组与聚合groupby 的威力分组聚合是数据分析的核心范式split-apply-combine。3.1 单字段分组dfpd.DataFrame({类别:[A,A,B,B,C],销售额:[100,150,200,250,300],成本:[60,80,120,140,180]})groupeddf.groupby(类别)print(grouped[销售额].mean())# 每类平均销售额print(grouped[销售额].sum())3.2 多字段分组df[城市][北京,上海,北京,上海,北京]grouped_multidf.groupby([类别,城市])print(grouped_multi[销售额].sum())3.3 聚合函数agg单列单函数.agg({列名: mean})单列多函数.agg({销售额: [sum, mean, count]})多列不同函数.agg({销售额: sum, 成本: mean})自定义函数.agg(lambda x: x.max() - x.min())resultdf.groupby(类别).agg({销售额:[sum,mean],成本:min})print(result)3.4 过滤与变换filter根据分组条件过滤组保留满足条件的整个组。transform将聚合结果广播回原始行常用于添加组内统计列。# 保留销售额总和大于 400 的组filtereddf.groupby(类别).filter(lambdax:x[销售额].sum()400)# 添加组内平均值列df[销售额_组内均指]df.groupby(类别)[销售额].transform(mean)4. 透视表与交叉表4.1 交叉表crosstab频数统计pd.crosstab用于计算两个或多个分类变量的频数分布。dfpd.DataFrame({性别:[男,女,男,女,男],城市:[北京,上海,北京,北京,上海],购买次数:[1,3,2,1,4]})# 性别 vs 城市的频数表ctpd.crosstab(df[性别],df[城市])print(ct)# 添加行/列总计ct_marginspd.crosstab(df[性别],df[城市],marginsTrue,margins_name总计)4.2 透视表pivot_table灵活聚合类似 Excel 数据透视表可指定行、列、值、聚合函数。# 按性别和城市统计购买次数的平均值ptpd.pivot_table(df,values购买次数,index性别,columns城市,aggfuncmean)print(pt)# 多个聚合函数pt_multipd.pivot_table(df,values购买次数,index性别,columns城市,aggfunc[sum,count])4.3 多级 index / 多 values# 多级行索引pt_levelspd.pivot_table(df,values购买次数,index[性别,城市],aggfuncsum)# 多 values 列pt_multi_valuespd.pivot_table(df,values[购买次数,性别],index城市,aggfunccount)5. 综合实战电商订单数据分析模拟一个电商订单数据集完成从清洗到聚合的全流程。importpandasaspdimportnumpyasnp# 创建订单数据orderspd.DataFrame({order_id:range(1,11),user_id:[101,102,101,103,104,101,102,105,103,106],category:[电子产品,服装,电子产品,食品,服装,电子产品,服装,食品,食品,电子产品],amount:[299,89,450,35,120,310,150,45,60,520],discount:[0.1,0.0,0.15,0.0,0.05,0.1,0.0,0.0,0.05,0.2]})# 故意引入一个缺失值orders.loc[5,amount]np.nanprint(原始数据)print(orders)# 1. 缺失值处理用该品类平均金额填充category_avgorders.groupby(category)[amount].transform(mean)orders[amount].fillna(category_avg,inplaceTrue)# 2. 计算实际支付金额金额 * (1 - 折扣)orders[paid]orders[amount]*(1-orders[discount])# 3. 分组聚合每用户的总支付金额和订单数user_statsorders.groupby(user_id).agg(总支付(paid,sum),订单数(order_id,count)).reset_index()print(\n用户统计)print(user_stats)# 4. 透视表各类别在不同折扣区间的平均支付金额orders[discount_bin]pd.cut(orders[discount],bins[-0.01,0.05,0.15,0.21],labels[低折扣,中折扣,高折扣])ptpd.pivot_table(orders,valuespaid,indexcategory,columnsdiscount_bin,aggfuncmean)print(\n透视表品类×折扣区间 平均支付)print(pt)# 5. 交叉表用户 vs 品类购买频数ctpd.crosstab(orders[user_id],orders[category])print(\n用户购买品类频次)print(ct)6. 小结与进阶建议本文系统介绍了 pandas 中四个核心进阶功能功能核心方法典型场景缺失值处理isna(),dropna(),fillna()数据清洗数据合并concat(),merge(),join()多表关联分组聚合groupby(),agg(),transform(),filter()统计分析透视表/交叉表pivot_table(),crosstab()多维汇总经验法则处理缺失时优先分析缺失原因合理填充或删除。合并数据前确保关联键的数据类型一致。分组聚合时使用agg一次完成多个统计代码更清晰。透视表是快速生成报表的利器尤其是多维度交叉分析。进阶方向时间序列数据的重采样resample窗口函数rolling,expanding性能优化使用eval()和query()处理大数据结合matplotlib/seaborn做可视化分析建议读者将本文代码逐一运行并尝试修改参数观察结果。掌握这些技能你就能应对绝大多数数据处理需求。