首页 游戏 软件 资讯 排行榜 专题
首页
业界动态
Pandas 精通十:透视表/交叉表实战,复杂数据汇总一键搞定

Pandas 精通十:透视表/交叉表实战,复杂数据汇总一键搞定

热心网友
23
转载
2026-04-22

吃透Pandas两大“数据汇总神器”:透视表与交叉表实战指南

在数据处理的工具箱里,如果说基础的清洗、筛选是基本功,那么多维度、交叉式的数据汇总,往往就是区分新手与熟手的分水岭。面对诸如“按地区加品类统计销售额”、“分析不同省份的商品订单分布”这类需求,如果还停留在手动分组、多层循环的老路上,不仅代码冗长,逻辑也容易缠绕不清。

免费影视、动漫、音乐、游戏、小说资源长期稳定更新! 👉 点此立即查看 👈

今天,我们就来彻底搞定Pandas中两大高效的数据汇总工具——透视表(pivot_table)与交叉表(crosstab)。掌握了它们,你会发现,再复杂的汇总需求,几行清晰、直观的代码就能优雅地实现,效率远超手动操作,灵活性也凌驾于传统Excel透视表之上。

承接上一篇关于时序数据的探讨,我们从入门一路走来,已经攻克了数据读取、清洗、筛选与合并。现在,是时候解锁高阶的数据洞察力了。

一、先搞懂:透视表/交叉表到底能解决什么问题?

想象一个典型的电商数据分析场景:你手头有一份订单数据,字段包括「订单ID、地区、商品品类、销售额、订单日期、购买数量」。老板或业务方可能会接连抛出这样几个问题:

  • 各个地区、不同品类的销售额总和分别是多少?
  • 每个省份的订单数量分布如何?
  • 能不能看到销售额随着地区和月份变化的趋势?

如果用基础的groupby,你往往需要多次分组、合并结果,过程繁琐;依赖Excel透视表,则难以实现自动化与批量处理,复用性差。而Pandas的pivot_tablecrosstab,正是为此而生。它们允许你像搭积木一样,直接指定“行”、“列”、“要计算的值”以及“计算方式”,一步到位生成结构清晰的汇总表,让复杂分析变得直观简单。

二、第一步:准备实战数据

理论说再多,不如上手实操。我们首先创建一份贴近真实业务场景的模拟电商订单数据,你可以直接复制以下代码运行,方便后续跟随练习。

import pandas as pd
import numpy as np

# 模拟电商订单数据
data = {
    '订单ID': ['001', '002', '003', '004', '005', '006', '007', '008'],
    '地区': ['北京', '上海', '北京', '广州', '上海', '广州', '北京', '上海'],
    '品类': ['家电', '服饰', '服饰', '家电', '家电', '服饰', '家电', '服饰'],
    '销售额': [5000, 800, 1200, 6000, 4500, 1000, 5500, 900],
    '购买数量': [1, 2, 3, 1, 1, 2, 2, 1],
    '订单日期': pd.date_range('2025-01-01', periods=8, freq='D')
}

# 转为DataFrame
df = pd.DataFrame(data)
print(“原始订单数据:”)
print(df)

运行这段代码,你将得到一份清晰的订单数据表,涵盖了地区、品类、销售额等多个维度。我们后续的所有示例都将基于这份数据展开。

三、核心1:pivot_table透视表——多维度数据汇总

1. 透视表基本语法(新手必记)

透视表的核心语法其实非常直观,它模拟了Excel数据透视表的逻辑:

pd.pivot_table(
    data,          # 要处理的DataFrame
    index=None,    # 行维度(按什么分组,相当于Excel透视表的“行”区域)
    columns=None,  # 列维度(相当于Excel透视表的“列”区域)
    values=None,   # 要汇总计算的数值字段(比如销售额、数量)
    aggfunc=‘mean’ # 聚合方式:常用有sum(求和)、mean(均值)、count(计数)等,默认是均值
)

一句话记住:indexcolumnsvalues是三大核心参数。入门时,至少需要指定indexvalues,其他参数按需添加即可。

2. 基础示例:按地区汇总销售额(单维度)

从一个最简单的需求开始:统计每个地区的销售额总和。这里,行维度是地区,要计算的值是销售额,计算方式是求和。

# 按地区汇总销售额
pivot1 = pd.pivot_table(
    df,
    index=‘地区’,       # 行:按地区分组
    values=‘销售额’,    # 要计算的字段:销售额
    aggfunc=‘sum’      # 聚合方式:求和
)
print(“\n按地区汇总销售额:”)
print(pivot1)

运行后,你会看到一个整洁的汇总表:

按地区汇总销售额:
      销售额
地区
上海   6200
北京  11700
广州   7000

效果是不是比df.groupby(‘地区’)[‘销售额’].sum()更规整?结果直接就是一张结构清晰的表格。

3. 进阶示例:多维度汇总(地区+品类)

接下来增加复杂度:统计“各地区、各品类”的销售额总和,同时还想看购买数量的总和。这意味着需要在行和列两个方向上进行交叉汇总。

# 多维度+多字段聚合
pivot2 = pd.pivot_table(
    df,
    index=‘地区’,               # 行:地区
    columns=‘品类’,             # 列:品类
    values=[‘销售额’, ‘购买数量’],# 要计算的字段:销售额、购买数量
    aggfunc=‘sum’              # 聚合方式:求和
)
print(“\n各地区+各品类汇总:”)
print(pivot2)

运行结果会形成一个多层级的表格,以“地区为行、品类为列”,同时展示销售额和购买数量两个指标的汇总结果,不同维度间的数据分布一目了然。

各地区+各品类汇总:
     购买数量        销售额
     品类    家电  服饰   家电   服饰
地区
上海     1    3   4500  1700
北京     3    3  10500  1200
广州     1    2   6000  1000

4. 实用技巧:处理缺失值+自定义聚合

实际数据往往不是完美的。如果某个地区缺少某个品类的数据,汇总结果就会出现恼人的NaN。这时,fill_value参数就派上用场了。另外,还可以针对不同的数值字段指定不同的聚合方式。

# 自定义聚合+填充缺失值
pivot3 = pd.pivot_table(
    df,
    index=‘地区’,
    columns=‘品类’,
    values=[‘销售额’, ‘购买数量’],
    aggfunc={‘销售额’: ‘sum’, ‘购买数量’: ‘count’}, # 销售额求和,购买数量计数
    fill_value=0 # 缺失值填充为0
)
print(“\n自定义聚合+填充缺失值:”)
print(pivot3)

三、核心2:crosstab交叉表——频次/占比统计

如果说透视表是功能全面的“瑞士军刀”,那么交叉表(crosstab)就是一把专精于频次统计的“手术刀”。它语法更简洁,特别适合处理分类数据,计算不同组合出现的次数或比例。

1. 交叉表基本语法

pd.crosstab(
    index,         # 行维度
    columns,       # 列维度
    values=None,   # 可选:指定基于哪个字段进行计算
    aggfunc=None,  # 可选:聚合方式(当指定values时)
    normalize=False# 可选:是否计算占比(归一化)
)

2. 基础示例:统计各地区各品类的订单数

一个经典需求:统计每个地区、每个品类分别产生了多少笔订单。这正是交叉表最擅长的频次统计。

# 交叉表统计订单数
cross1 = pd.crosstab(
    index=df[‘地区’],    # 行:地区
    columns=df[‘品类’], # 列:品类
    aggfunc=‘count’,    # 聚合方式:计数
    values=df[‘订单ID’] # 按订单ID计数,确保准确性
)
print(“\n各地区各品类订单数:”)
print(cross1)

运行结果清晰展示了订单的分布矩阵:

各地区各品类订单数:
品类  家电  服饰
地区
上海   2    2
北京   2    1
广州   1    1

3. 进阶示例:计算占比(归一化)

比频次更进一步的是比例。比如,我们想知道在每个地区内部,不同品类的订单数占该地区总订单数的比例。交叉表的normalize参数让这一切变得极其简单。

# 计算占比(按行归一化,即每行总和为1)
cross2 = pd.crosstab(
    index=df[‘地区’],
    columns=df[‘品类’],
    aggfunc=‘count’,
    values=df[‘订单ID’],
    normalize=‘index’ # 按行归一化(选项还有‘columns’按列,‘all’全局归一化)
).round(2) # 保留两位小数
print(“\n各地区各品类订单数占比:”)
print(cross2)

现在,你可以一眼看出上海地区家电和服饰订单平分秋色,而北京地区家电订单占比更高:

各地区各品类订单数占比:
品类   家电   服饰
地区
上海  0.50  0.50
北京  0.67  0.33
广州  0.50  0.50

四、实战案例:综合分析电商数据

最后,我们把透视表和交叉表组合起来,完成一个稍具综合性的小分析,模拟真实的业务场景。

# 1. 先添加“月份”字段(从订单日期提取)
df[‘月份’] = df[‘订单日期’].dt.month

# 2. 按“地区+月份”汇总销售额
pivot_total = pd.pivot_table(
    df,
    index=[‘地区’, ‘月份’],
    values=‘销售额’,
    aggfunc=‘sum’,
    fill_value=0
)

# 3. 统计各地区销售额占总销售额的比例
cross_ratio = pd.crosstab(
    index=df[‘地区’],
    columns=‘销售额占比’,
    values=df[‘销售额’],
    aggfunc=‘sum’,
    normalize=‘all’
).round(2)

print(“\n按地区+月份汇总销售额:”)
print(pivot_total)
print(“\n各地区销售额占比:”)
print(cross_ratio)

运行这段代码,你将一次性得到两个维度的洞察:一是各地区在不同月份的销售额明细,二是各地区对总销售额的贡献占比。用极简的代码完成多维分析,这正是Pandas高效数据处理能力的体现。

五、新手避坑指南

掌握了基本操作,再了解几个常见坑点,能让你在实际应用中更加得心应手:

  • 留意默认聚合函数pivot_tableaggfunc默认是‘mean’(均值)。如果想求和,务必明确指定aggfunc=‘sum’,否则可能得到意外的平均值结果。
  • 主动处理缺失值:汇总结果中间出现NaN时,务必使用fill_value参数(如设为0)进行填充,以免影响后续的数值计算或可视化。
  • 支持多级分组indexcolumns参数不仅可以接收单个字段名,也可以传入一个字段列表,如index=[‘地区’, ‘月份’],以实现多层级的分组汇总。
  • 明确工具分工:牢记crosstabpivot_table的核心区别。前者专攻分类数据的频次与占比统计;后者则更通用,适合对数值型字段进行多维度、多指标的复杂聚合运算。

六、总结

说到底,Pandas的透视表(pivot_table)和交叉表(crosstab)是将杂乱数据转化为清晰洞察的桥梁。通过熟练运用indexcolumnsvaluesaggfunc这几个核心参数,你几乎可以应对所有常规的数据汇总需求。

记住,pivot_table是你的多面手,负责复杂的数值汇总;而crosstab则是你的快枪手,专精于频次与占比分析。在实践中,注意根据数据特点选择合适的聚合方式,并善用fill_value处理数据缺口,就能有效避免常见错误,让数据分析工作既高效又准确。

来源:https://www.51cto.com/article/835492.html
免责声明: 游乐网为非赢利性网站,所展示的游戏/软件/文章内容均来自于互联网或第三方用户上传分享,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系youleyoucom@outlook.com。

相关攻略

Pandas 精通十:透视表/交叉表实战,复杂数据汇总一键搞定
业界动态
Pandas 精通十:透视表/交叉表实战,复杂数据汇总一键搞定

吃透Pandas两大“数据汇总神器”:透视表与交叉表实战指南 在数据处理的工具箱里,如果说基础的清洗、筛选是基本功,那么多维度、交叉式的数据汇总,往往就是区分新手与熟手的分水岭。面对诸如“按地区加品类统计销售额”、“分析不同省份的商品订单分布”这类需求,如果还停留在手动分组、多层循环的老路上,不仅代

热心网友
04.22
Pandas 入门一:零基础也能懂!3步安装+10分钟玩转数据读取
业界动态
Pandas 入门一:零基础也能懂!3步安装+10分钟玩转数据读取

「Pandas从入门到精通」系列一:从零到一的起手式,10分钟搞定安装与数据读取 很多数据分析的探索旅程,往往就卡在第一步:面对海量的表格数据,手动整理效率低下且易错;想要用代码提升效率,却被陌生的术语和复杂的环境配置劝退。 如果你也有过类似的困扰,那么今天的内容正是为你准备的。我们将一起认识数据分

热心网友
04.14
Pandas-Profiling,一个 Python 效率神器!
业界动态
Pandas-Profiling,一个 Python 效率神器!

Pandas-Profiling:让探索性数据分析效率翻倍的神器 很多数据分析新手,最初可能都用过 df describe() 和 df info() 这两板斧来初步了解数据。这当然没错,但效率上总感觉差了那么一口气。 今天要介绍一个堪称神器的工具——Pandas-Profiling。它能一键生成一

热心网友
04.14
Pandas 入门二:DataFrame 核心操作,新手也能轻松筛选/修改数据
业界动态
Pandas 入门二:DataFrame 核心操作,新手也能轻松筛选/修改数据

Pandas数据处理实战:从数据洞察到精准操作 在上一篇文章中,我们掌握了Pandas的安装和数据读取,成功将表格数据加载为DataFrame。今天,我们将继续深入,聚焦数据处理中最核心的三个环节:如何快速了解你的数据、如何精准筛选出目标信息,以及如何高效地修改数据内容。每个环节都配有可直接复制的代

热心网友
04.14
Pandas 入门三:数据清洗必学!缺失值/重复值处理,一步到位不踩坑
业界动态
Pandas 入门三:数据清洗必学!缺失值/重复值处理,一步到位不踩坑

今天我们将会学习 Pandas 数据清洗的核心:缺失值“先检测后处理(删除 填充)”,重复值“一键去重”,新手跟着代码跑一遍就能掌握! 大家好,Pandas系列教程继续推进。前两期我们搭建了基础环境,掌握了数据读取和DataFrame的核心操作。今天,我们要深入到数据处理中避不开的“关键一步”——数

热心网友
04.14

最新APP

宝宝过生日
宝宝过生日
应用辅助 04-07
台球世界
台球世界
体育竞技 04-07
解绳子
解绳子
休闲益智 04-07
骑兵冲突
骑兵冲突
棋牌策略 04-07
三国真龙传
三国真龙传
角色扮演 04-07

热门推荐

连亏五个季度后,光伏板块终于盈利了
科技数码
连亏五个季度后,光伏板块终于盈利了

三季报收官,光伏企业交出了近年难得的尚佳成绩 三季报发布完毕,光伏行业总算交出了一份近年来难得的、还算不错的成绩单。市场等这一刻,确实等了挺久。 根据Choice光伏设备板块收录的78家企业财报,整个板块三季度的净利润达到了7 58亿元。这个数字怎么看?不妨对比一下:就在二季度,板块的净亏损还高达4

热心网友
04.22
天龙三号首飞失利:与猎鹰9号对标之路,归零迭代成破局关键
科技数码
天龙三号首飞失利:与猎鹰9号对标之路,归零迭代成破局关键

北京天兵科技天龙三号火箭首飞失利解析 最近,北京天兵科技自主研发的天龙三号大型液体运载火箭,在酒泉卫星发射中心执行首次飞行任务时遭遇失利,这无疑是给国内商业航天关注者带来了一次震动。这款被寄予厚望的火箭,瞄准的是近地轨道20吨级的可回收运力,其设计初衷是通过低成本、高频次的发射模式,抢占一箭36星组

热心网友
04.22
开发者自建48台Mac mini集群,撑起Overcast播客转录
科技数码
开发者自建48台Mac mini集群,撑起Overcast播客转录

苹果芯片实战:48台Mac mini搭建本地AI集群,如何碘伏云端语音识别? 最近科技圈有个挺有意思的消息。知名播客应用Overcast的开发者Marco Arment,自己动手搭了个“大家伙”——一个由48台苹果Mac mini组成的服务器集群。关键是,这个集群没走寻常路,它完全绕开了云端AI服务

热心网友
04.22
领克10+与10全球首秀:高效补能搭配赛道王者,开启纯电高性能新篇
科技数码
领克10+与10全球首秀:高效补能搭配赛道王者,开启纯电高性能新篇

纯电赛道再进化:领克10系列如何重新定义“运动轿车”? 如果问,纯电时代最让人怀念传统燃油车的是什么?很多人会把票投给两件事:说走就走的补能,和随心所欲的操控。最近,领克用一场全球首秀给出了自己的答案。旗下全新的中大型运动轿车领克10,以及更极致的性能版本领克10+联袂登场。这不仅仅是两款新车,更像

热心网友
04.22
Apple Vision Pro新专利曝光:将实现按需定制与组件更换
科技数码
Apple Vision Pro新专利曝光:将实现按需定制与组件更换

苹果正酝酿一款“可自定义”的Vision Pro,核心框架支持模块化拼装 一则来自供应链和专利领域的消息,引起了科技圈的关注。4月8日,有外媒报道指出,苹果似乎并不满足于当前的一体化设计思路,其正在深入探索如何打造一款高度可自定义的Apple Vision Pro。未来的VR AR头显,用户或许能像

热心网友
04.22