You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python中基于DataFrame的交叉表(Crosstab)实现需求求助

解决方案

要实现你需要的交叉表,可以通过分组聚合+透视表的组合步骤完成,具体代码如下:

步骤1:准备数据,聚合每个交易的总销售额与分类销量

首先按交易ID(Transaction)分组,计算每个交易的总销售额;同时将分类(Category)转为列,提取每个交易对应Everyday和Other的销量,缺失的分类销量填充为0:

import pandas as pd

# 假设你的basket DataFrame已存在
# 1. 计算每个交易的总销售额
total_sales = basket.groupby('Transaction')['Sales_Value'].sum().reset_index(name='Total_Sales')

# 2. 提取每个交易的Everyday/Other销量,缺失填充0
vol_by_category = basket.pivot(
    index='Transaction',
    columns='Category',
    values='Sales_Vol'
).fillna(0).reset_index()

# 3. 合并销量与总销售额数据
combined_data = pd.merge(vol_by_category, total_sales, on='Transaction')

步骤2:构建目标交叉表

用透视表按Everyday销量(行)和Other销量(列)聚合总销售额,再补全缺失的行/列(0-3的销量范围),最后调整格式:

# 构建透视表,聚合对应组合的总销售额
cross_table = combined_data.pivot_table(
    index='Everyday',
    columns='Other',
    values='Total_Sales',
    aggfunc='sum',
    fill_value=0
)

# 补全0-3的行和列,缺失值填充0
vol_range = [0, 1, 2, 3]
cross_table = cross_table.reindex(index=vol_range, columns=vol_range, fill_value=0)

# 调整索引为Vols列,匹配目标格式
cross_table = cross_table.reset_index().rename(columns={'Everyday': 'Vols'})

最终结果

运行上述代码后,cross_table就是你需要的格式:

Vols0123
00000
11.78000
2006.065.55
30000

关键说明

  • 用pivot将分类转为列,方便获取每个交易的双分类销量
  • pivot_table负责聚合对应销量组合的总销售额
  • reindex补全0-3的销量范围,确保表格结构与目标一致

内容的提问来源于stack exchange,提问作者S L

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.18 02:35:37