在Pandas中生成按城市、月份统计的Visa销售额占比透视表
Pandas实现城市×月份的Visa销售额占比透视表
需要生成一个透视表,展示以城市为行、月份为列的Visa销售额占比,期望输出如下:
Jan Feb London 50.055991 56.435644 Paris 15.119760 67.170191
此前用DAX可快速处理此类需求,但刚接触Pandas时尝试多种透视表和group-by函数都未达到预期,习惯了Excel中创建“度量值”后加入透视表的方式。
可复现输入数据:
import pandas as pd data = {'Month': {0: 'Jan', 1: 'Jan', 2: 'Jan', 3: 'Jan', 4: 'Feb', 5: 'Feb', 6: 'Feb', 7: 'Feb', 8: 'Feb'}, 'City': {0: 'Paris', 1: 'Paris', 2: 'London', 3: 'London', 4: 'Paris', 5: 'Paris', 6: 'London', 7: 'London', 8: 'Paris'}, 'Card': {0: 'Visa', 1: 'MasterCard', 2: 'Visa', 3: 'MasterCard', 4: 'Visa', 5: 'MasterCard', 6: 'Visa', 7: 'MasterCard', 8: 'Visa'}, ' Amount ': {0: ' $101 ', 1: ' $567 ', 2: ' $447 ', 3: ' $446 ', 4: ' $926 ', 5: ' $652 ', 6: ' $114 ', 7: ' $88 ', 8: ' $408 '}} df = pd.DataFrame.from_dict(data)
步骤1:数据清洗转换
首先处理金额列,去除美元符号和空格,转为数值类型:
# 清理金额列并转换为数值 df['Amount'] = df[' Amount '].str.replace('$', '').str.strip().astype(float) # 删除原冗余的金额列 df = df.drop(' Amount ', axis=1)
步骤2:计算分组汇总值
分别统计每个城市-月份维度下的Visa销售额、全卡种总销售额,再计算占比:
# 按城市+月份分组,计算Visa总销售额 visa_sales = df[df['Card'] == 'Visa'].groupby(['City', 'Month'])['Amount'].sum().rename('VisaAmount') # 按城市+月份分组,计算全卡种总销售额 total_sales = df.groupby(['City', 'Month'])['Amount'].sum().rename('TotalAmount') # 合并数据并计算Visa销售额占比(转为百分比格式) ratio_df = pd.concat([visa_sales, total_sales], axis=1) ratio_df['VisaRatio'] = (ratio_df['VisaAmount'] / ratio_df['TotalAmount']) * 100
步骤3:透视成目标格式
将结果透视为“城市为行、月份为列”的结构:
result = ratio_df['VisaRatio'].unstack(fill_value=0) print(result)
运行后输出与预期一致:
Jan Feb London 50.055991 56.435644 Paris 15.119760 67.170191
内容的提问来源于stack exchange,提问作者Maximuluss
相关产品推荐
相关产品推荐

