如何用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其实完全可以实现这个需求,步骤如下:
- 先筛选出
bad=1的子数据集; - 用
pd.crosstab生成交叉表,指定行、列对应字段; - 手动指定区间的排序顺序,确保和预期格式一致;
- 补全缺失的区间类别并填充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
相关产品推荐
相关产品推荐

