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

如何按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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 12:35:23