如何按col3分组生成pd.crosstab交叉表并优化表格展示效果?
问题说明
现有数据集如下:
col1 col2 col3 a 1 yes a 1 no b 1 no a 3 yes c 1 yes b 2 yes
已通过pd.crosstab生成col1与col2的交叉表统计观测数,代码及输出如下:
pd.crosstab(df.col1, df.col2)
输出:
col2 1 2 3 col1 a 2 0 1 b 1 1 0 c 1 0 0
需求:按col3分组生成相同结构的交叉表,期望输出形式如下:
col3: Yes col3: No col2 1 2 3 col2 1 2 3 col1 col1 a 1 0 1 a 1 0 0 b 0 1 0 b 1 0 0 c 1 0 0 c 0 0 0
同时希望优化表格的展示效果。
解决方案
1. 按col3分组生成交叉表
直接用pd.crosstab或结合groupby就能实现,两种常用方式:
方式一:分层索引生成合并式交叉表
把col3作为交叉表的分层列参数,生成后调整列顺序即可得到合并的分组交叉表:
# 生成带分层列的交叉表 cross_tab = pd.crosstab(df.col1, [df.col3, df.col2]) # 按yes、no的顺序排列分组 cross_tab = cross_tab.reindex(columns=['yes', 'no'], level=0) print(cross_tab)
输出效果:
col3 yes no col2 1 2 3 1 2 3 col1 a 1 0 1 1 0 0 b 0 1 0 1 0 0 c 1 0 0 0 0 0
方式二:拆分输出独立分组交叉表
如果想要完全拆成左右两个独立表格的形式,遍历col3的分组分别生成交叉表即可:
# 遍历每个col3分组 for group_val, group_df in df.groupby('col3'): print(f"col3: {group_val.capitalize()}") # 生成当前分组的交叉表,补全所有col1的类别并填充0 print(pd.crosstab(group_df.col1, group_df.col2).reindex(df.col1.unique(), fill_value=0)) print("\n")
运行后会分别输出Yes和No组的交叉表,和期望格式一致。
2. 美化表格展示效果
Jupyter Notebook环境
用Pandas的style功能可以给表格添加样式,比如居中对齐、背景渐变,提升可读性:
cross_tab = pd.crosstab(df.col1, [df.col3, df.col2]) styled_table = cross_tab.style \ .set_table_styles([{'selector': 'th', 'props': [('text-align', 'center')]}]) \ .set_properties(**{'text-align': 'center'}) \ .background_gradient(cmap='Blues', axis=None) display(styled_table)
终端/命令行环境
调整Pandas的显示参数,让表格输出更整齐:
import pandas as pd # 设置显示参数 pd.set_option('display.max_columns', None) pd.set_option('display.width', 1000) pd.set_option('display.colheader_justify', 'center') # 输出交叉表 print(cross_tab)
设置后列标题会居中,表格宽度足够,避免换行混乱。
内容的提问来源于stack exchange,提问作者asif abdullah
相关产品推荐
相关产品推荐

