模块四-数据转换与操作——29. 透视表与交叉表

模块四-数据转换与操作——29. 透视表与交叉表 29. 透视表与交叉表1. 概述透视表Pivot Table和交叉表Crosstab是数据汇总的强大工具类似于 Excel 中的数据透视表。它们可以将数据按照行和列进行分组聚合快速生成汇总报表。importpandasaspdimportnumpyasnp# 创建示例数据np.random.seed(42)dfpd.DataFrame({日期:pd.date_range(2024-01-01,periods100,freqD),产品:np.random.choice([产品A,产品B,产品C],100),地区:np.random.choice([华东,华南,华北,西南],100),销售额:np.random.randint(1000,10000,100),销量:np.random.randint(10,200,100),销售员:np.random.choice([张三,李四,王五],100)})print(原始数据:)print(df.head())2. pivot_table() 透视表2.1 基本用法# 单行单列透视pivotpd.pivot_table(df,values销售额,index产品,columns地区,aggfuncsum)print(产品销售汇总按地区:)print(pivot)# 多聚合函数pivotpd.pivot_table(df,values销售额,index产品,columns地区,aggfunc[sum,mean])print(\n产品销售汇总求和平均:)print(pivot)2.2 多级索引# 多行索引pivotpd.pivot_table(df,values销售额,index[产品,销售员],columns地区,aggfuncsum)print(产品×销售员 销售汇总:)print(pivot)# 多列索引pivotpd.pivot_table(df,values销售额,index产品,columns[地区,销售员],aggfuncsum)print(\n地区×销售员 销售汇总:)print(pivot)2.3 多值字段# 对多个值字段进行透视pivotpd.pivot_table(df,values[销售额,销量],index产品,columns地区,aggfuncsum)print(销售额和销量汇总:)print(pivot)2.4 填充缺失值# 创建包含缺失值的透视表pivotpd.pivot_table(df,values销售额,index产品,columns地区,aggfuncsum)print(原始透视表有缺失:)print(pivot)# 填充缺失值pivot_filledpd.pivot_table(df,values销售额,index产品,columns地区,aggfuncsum,fill_value0)print(\n填充缺失值后:)print(pivot_filled)2.5 边际汇总# 添加行和列的汇总marginspivotpd.pivot_table(df,values销售额,index产品,columns地区,aggfuncsum,marginsTrue,margins_name总计)print(带边际汇总的透视表:)print(pivot)3. crosstab() 交叉表3.1 基本用法crosstab专门用于计算两个或多个分类变量的频数分布。# 单变量频数统计crosspd.crosstab(df[产品],df[地区])print(产品×地区 频数分布:)print(cross)# 添加边际汇总crosspd.crosstab(df[产品],df[地区],marginsTrue,margins_name合计)print(\n带边际汇总的交叉表:)print(cross)3.2 归一化# 按行归一化行百分比cross_rowpd.crosstab(df[产品],df[地区],normalizeindex)print(行百分比:)print(cross_row.round(2))# 按列归一化列百分比cross_colpd.crosstab(df[产品],df[地区],normalizecolumns)print(\n列百分比:)print(cross_col.round(2))# 整体归一化总百分比cross_allpd.crosstab(df[产品],df[地区],normalizeall)print(\n总百分比:)print(cross_all.round(2))3.3 聚合值# 计算销售额总和cross_aggpd.crosstab(df[产品],df[地区],valuesdf[销售额],aggfuncsum)print(销售额总和:)print(cross_agg)# 计算销售额平均值cross_aggpd.crosstab(df[产品],df[地区],valuesdf[销售额],aggfuncmean)print(\n销售额平均值:)print(cross_agg.round(0))4. pivot() 方法pivot是简单的重塑方法不进行聚合要求索引/列组合唯一。# 创建唯一组合的数据unique_dfpd.DataFrame({产品:[A,A,B,B],地区:[华东,华南,华东,华南],销售额:[1000,1500,2000,2500]})# pivot 重塑pivotedunique_df.pivot(index产品,columns地区,values销售额)print(pivot 重塑:)print(pivoted)5. pivot_table vs crosstab vs pivot方法用途聚合适用场景pivot_table数据透视✅ 支持数值汇总crosstab交叉表✅ 支持频数统计pivot简单重塑❌ 不支持数据重排6. 完整示例销售数据分析# 创建详细销售数据np.random.seed(42)salespd.DataFrame({日期:pd.date_range(2024-01-01,periods200,freqD),季度:np.repeat([Q1,Q2,Q3,Q4],50),产品:np.random.choice([产品A,产品B,产品C],200),地区:np.random.choice([华东,华南,华北,西南],200),销售额:np.random.randint(1000,10000,200),销量:np.random.randint(10,200,200),销售员:np.random.choice([张三,李四,王五,赵六],200)})print(*60)print(销售数据透视分析)print(*60)print(\n原始数据:)print(sales.head())# 1. 产品 × 地区 销售汇总print(\n1. 产品 × 地区 销售汇总:)pivot1pd.pivot_table(sales,values销售额,index产品,columns地区,aggfuncsum,fill_value0)print(pivot1)# 2. 季度 × 产品 销售趋势print(\n2. 季度 × 产品 销售趋势:)pivot2pd.pivot_table(sales,values销售额,index季度,columns产品,aggfuncsum)print(pivot2)# 3. 销售员 × 产品 业绩print(\n3. 销售员 × 产品 业绩:)pivot3pd.pivot_table(sales,values销售额,index销售员,columns产品,aggfuncsum,fill_value0)print(pivot3)# 4. 多层级分析地区 × 季度 × 产品print(\n4. 地区 × 季度 销售额:)pivot4pd.pivot_table(sales,values销售额,index地区,columns季度,aggfuncsum)print(pivot4)# 5. 交叉表产品 × 地区 销售次数print(\n5. 产品 × 地区 销售次数:)cross1pd.crosstab(sales[产品],sales[地区])print(cross1)# 6. 交叉表销售员 × 产品带百分比print(\n6. 销售员 × 产品 销售占比行百分比:)cross2pd.crosstab(sales[销售员],sales[产品],normalizeindex)print(cross2.round(2))# 7. 多维透视print(\n7. 地区 × 产品 × 季度 销售额:)pivot5pd.pivot_table(sales,values销售额,index[地区,产品],columns季度,aggfuncsum,fill_value0)print(pivot5)7. 参数详解参数说明示例values需要聚合的列values销售额index行索引index产品columns列索引columns地区aggfunc聚合函数aggfuncsum或aggfunc[sum,mean]fill_value填充缺失值fill_value0margins添加边际汇总marginsTruemargins_name边际汇总名称margins_name总计normalize归一化normalizeindex8. 总结需求推荐方法示例数值汇总透视pivot_tablepd.pivot_table(df, values销售额, index产品, columns地区, aggfuncsum)频数统计crosstabpd.crosstab(df[产品], df[地区])带边际汇总marginsTruepd.pivot_table(..., marginsTrue)填充缺失值fill_value0pd.pivot_table(..., fill_value0)多聚合函数aggfunc[sum,mean]pd.pivot_table(..., aggfunc[sum,mean])百分比normalizepd.crosstab(..., normalizeindex)简单重塑pivotdf.pivot(index产品, columns地区, values销售额)