Python pandas将Excel多列品牌数据转为交叉表行索引并添加合计列
解决方案
核心思路
你之前直接将品牌多列传入crosstab的index参数无法得到预期结果,是因为原始数据为宽表结构,每一行对应单个受访者,每个品牌列仅存储该受访者是否选中对应品牌的标识,需要先转换为长表结构,过滤出选中的品牌记录后再生成交叉表。
实现步骤
1. 导入依赖并读取数据
import pandas as pd # 替换为你的Excel文件路径 df = pd.read_excel("调研数据.xlsx")
2. 定义参数并转换数据结构
假设你的数据源包含受访者ID、性别字段,其余多选品牌列名为品牌A、品牌B、品牌C、品牌D,可按需修改对应参数:
# 定义所有品牌列的列名列表 brand_cols = ["品牌A", "品牌B", "品牌C", "品牌D"] # 宽表转长表,提取品牌选中记录 long_df = df.melt( id_vars=["受访者ID", "性别"], value_vars=brand_cols, var_name="品牌", value_name="是否选中" ) # 过滤出选中的记录,若你的选中标识为"是",可将1改为"是" long_df = long_df[long_df["是否选中"] == 1]
3. 生成带合计的交叉表
# 生成交叉表,margins参数控制是否添加合计 cross_tab = pd.crosstab( index=long_df["品牌"], columns=long_df["性别"], margins=True, margins_name="合计" ) # 可选:保留所有品牌(含无人选中的品牌,次数填充为0) cross_tab = cross_tab.reindex(brand_cols + ["合计"]).fillna(0).astype(int)
输出示例
最终生成的交叉表结构如下:
| 品牌 | 男 | 女 | 合计 |
|---|---|---|---|
| 品牌A | 12 | 8 | 20 |
| 品牌B | 5 | 15 | 20 |
| 品牌C | 9 | 11 | 20 |
| 品牌D | 7 | 3 | 10 |
| 合计 | 33 | 37 | 70 |
内容的提问来源于stack exchange,提问作者Benjamin Roy
相关产品推荐
相关产品推荐

