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就是你需要的格式:
| Vols | 0 | 1 | 2 | 3 |
|---|---|---|---|---|
| 0 | 0 | 0 | 0 | 0 |
| 1 | 1.78 | 0 | 0 | 0 |
| 2 | 0 | 0 | 6.06 | 5.55 |
| 3 | 0 | 0 | 0 | 0 |
关键说明
- 用
pivot将分类转为列,方便获取每个交易的双分类销量 pivot_table负责聚合对应销量组合的总销售额reindex补全0-3的销量范围,确保表格结构与目标一致
内容的提问来源于stack exchange,提问作者S L
相关产品推荐
相关产品推荐

