Pandas 中如何在透视表中计算各分类占列总和的百分比

夜静同学_3347

夜静同学_3347

2026-05-31

586人浏览

原创

本文介绍使用 pandas 的 pd.crosstab 配合 normalize='columns' 快速生成按城市-月份分组的 Visa 销售额占比表,避免手动计算分母,实现类似 DAX 中“% of Column Total”的效果。

本文介绍使用 pandas 的 `pd.crosstab` 配合 `normalize='columns'` 快速生成按城市-月份分组的 visa 销售额占比表,避免手动计算分母,实现类似 dax 中“% of column total”的效果。

在数据分析中,常需将原始交易数据转换为“某维度(如支付方式)在另一组交叉维度(如城市 × 月份)中的占比”。与 Excel 或 Power BI 中通过 DAX 创建动态度量不同,pandas 需借助结构化聚合与归一化机制实现同等效果。核心在于:占比必须基于每个(City, Month)组合下的全部支付金额(Visa + MasterCard)作为分母,而非全局或行/列总和。

以下为完整、可复现的解决方案:

import pandas as pd

# 构造示例数据
data = {
    'Month': ['Jan', 'Jan', 'Jan', 'Jan', 'Feb', 'Feb', 'Feb', 'Feb', 'Feb'],
    'City': ['Paris', 'Paris', 'London', 'London', 'Paris', 'Paris', 'London', 'London', 'Paris'],
    'Card': ['Visa', 'MasterCard', 'Visa', 'MasterCard', 'Visa', 'MasterCard', 'Visa', 'MasterCard', 'Visa'],
    ' Amount ': [' $101 ', ' $567 ', ' $447 ', ' $446 ', ' $926 ', ' $652 ', ' $114 ', ' $88 ', ' $408 ']
}
df = pd.DataFrame(data)

# 步骤 1:清洗金额列(去除空格与美元符号,转为整数)
df[' Amount '] = df[' Amount '].str.strip().str.replace(r'[$\s]', '', regex=True).astype(int)

# 步骤 2:使用 crosstab 构建多级列透视表,并按列归一化(即每列独立除以其列和)
ct = pd.crosstab(
    index=df['Card'],
    columns=[df['City'], df['Month']],
    values=df[' Amount '],
    aggfunc='sum',
    normalize='columns'  # ✅ 关键:对每个 (City, Month) 组合内的 Card 值归一化
)

# 步骤 3:重塑结构——将 City 提升为行索引,筛选 Visa 行,按指定月份排序
result = (
    ct.stack(level='City', future_stack=True)  # 将 City 列级转为行索引
    .loc['Visa', ['Jan', 'Feb']]               # 只取 Visa 行,并固定列顺序
    .mul(100)                                  # 转换为百分比
    .round(2)                                  # 可选:保留两位小数提升可读性
)

print(result)

输出结果:

Month         Jan     Feb
City                     
London     50.06   56.44
Paris      15.12   67.17

? 关键原理说明:normalize='columns' 并非对整个 DataFrame 的列求和,而是对 crosstab 输出中每个最细粒度列(即每个 (City, Month) 元组)单独归一化。例如,('London', 'Feb') 列下 Visa=114、MasterCard=88,其列和为 202 → Visa 占比 = 114 / 202 ≈ 56.44%。这正是业务所需的“Visa 占当月该城市总销售额的比例”。

注意事项:

  • 若原始数据含缺失值或非数值金额,务必在 astype(int) 前做健壮清洗(如 pd.to_numeric(..., errors='coerce'));
  • stack(level='City') 要求列索引为 MultiIndex,且 'City' 必须是其一级名称(可通过 ct.columns.names 确认);
  • future_stack=True 是 pandas 2.1+ 推荐参数,兼容未来版本行为;旧版本可省略;
  • 如需扩展至更多卡类型(如 Amex),无需修改逻辑,crosstab 会自动处理所有唯一值。

此方法简洁、向量化、语义清晰,是 pandas 中替代 DAX “% of Column Total” 度量的标准实践。

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
python打包成可执行文件
python打包成可执行文件

本专题为大家带来python打包成可执行文件相关的文章,大家可以免费的下载体验。

2023.07.20

1691

4

python能做什么
python能做什么

python能做的有:可用于开发基于控制台的应用程序、多媒体部分开发、用于开发基于Web的应用程序、使用python处理数据、系统编程等等。本专题为大家提供python相关的各种文章、以及下载和课程。

2023.07.25

4264

7

format在python中的用法
format在python中的用法

Python中的format是一种字符串格式化方法,用于将变量或值插入到字符串中的占位符位置。通过format方法,我们可以动态地构建字符串,使其包含不同值。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

2023.07.31

1689

3

python教程
python教程

Python已成为一门网红语言,即使是在非编程开发者当中,也掀起了一股学习的热潮。本专题为大家带来python教程的相关文章,大家可以免费体验学习。

2023.08.03

24857

23

python环境变量的配置
python环境变量的配置

Python是一种流行的编程语言,被广泛用于软件开发、数据分析和科学计算等领域。在安装Python之后,我们需要配置环境变量,以便在任何位置都能够访问Python的可执行文件。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.08.04

3027

5

python eval
python eval

eval函数是Python中一个非常强大的函数,它可以将字符串作为Python代码进行执行,实现动态编程的效果。然而,由于其潜在的安全风险和性能问题,需要谨慎使用。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.08.04

3067

5

scratch和python区别
scratch和python区别

scratch和python的区别:1、scratch是一种专为初学者设计的图形化编程语言,python是一种文本编程语言;2、scratch使用的是基于积木的编程语法,python采用更加传统的文本编程语法等等。本专题为大家提供scratch和python相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.11

1163

5

python合并两个列表
python合并两个列表

Python是一种强大的编程语言,具有许多方便的功能和工具。在Python中,有多种方法可以合并两个列表。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.08.10

596

4

python是前端还是后端
python是前端还是后端

Python属于前端也属于后端,其灵活性和丰富的生态系统使得开发人员能够在不同的领域中灵活运用。本专题为大家提供python相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.11

2363

5

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
热门推荐
/
最新课程
phpStudy极速入门视频教程
phpStudy极速入门视频教程

共6课时 | 54.6万人学习

独孤九贱(4)_PHP视频教程
独孤九贱(4)_PHP视频教程

共89课时 | 133.4万人学习