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

如何用Python生成基于bad=1条件的score1与score2交叉表?

问题描述

原始数据集:

bad score1 score2
1    80-90  70-80
0    90-100 80-90
1    70-80  90-100
1    70-80 70-80
0    70-80 70-80
1    80-90  70-80

需要生成仅统计bad=1的样本中,score1与score2区间的交叉计数表,预期格式如下:

70-80 80-90 90-100 (score2)
70-80   1     0       1
80-90   2     0       0
90-100  0     1       0
(score1)

已知pd.crosstab有类似功能,但认为无法满足需求,求可行实现方案。

解决方案

pd.crosstab其实完全可以实现这个需求,步骤如下:

  1. 先筛选出bad=1的子数据集;
  2. 用pd.crosstab生成交叉表,指定行、列对应字段;
  3. 手动指定区间的排序顺序,确保和预期格式一致;
  4. 补全缺失的区间类别并填充0。

具体代码实现:

import pandas as pd

# 构造原始数据
df = pd.DataFrame({
    'bad': [1, 0, 1, 1, 0, 1],
    'score1': ['80-90', '90-100', '70-80', '70-80', '70-80', '80-90'],
    'score2': ['70-80', '80-90', '90-100', '70-80', '70-80', '70-80']
})

# 筛选bad=1的样本
filtered = df[df['bad'] == 1]

# 定义score区间的固定排序
score_categories = ['70-80', '80-90', '90-100']

# 生成交叉表并调整行列顺序
cross_table = pd.crosstab(
    index=filtered['score1'],
    columns=filtered['score2'],
    rownames=['score1'],
    colnames=['score2']
).reindex(index=score_categories, columns=score_categories, fill_value=0)

print(cross_table)

运行输出:

score2   70-80  80-90  90-100
score1                        
70-80        1      0        1
80-90        2      0        0
90-100       0      0        0

注:你提供的示例结果中90-100行对应80-90列的数值为1,但原始数据里没有bad=1且score1=90-100、score2=80-90的样本,所以实际统计结果该位置为0,应该是示例存在笔误。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 03:10:48