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

如何对DataFrame的score_x和score_y分箱后生成交叉计数表?

解决方案

首先定义统一的分箱区间:

bins = [0,5,10,15,20,25,30]

方法一:使用pd.crosstab(推荐)

直接对两个字段分别做分箱,一步生成符合要求的交叉计数表,代码如下:

import pandas as pd

data = [[0,9], [10, 15], [11, 14],[1,3],[2,7],[4,31]]
df = pd.DataFrame(data, columns=['score_x', 'score_y'])

bins = [0,5,10,15,20,25,30]
cross_table = pd.crosstab(
    pd.cut(df['score_x'], bins=bins, right=False),  # 左闭右开区间,显示为0-5、5-10这类格式
    pd.cut(df['score_y'], bins=bins, right=False),
    dropna=False  # 保留所有分箱区间,无数据的位置填0
)

print(cross_table)

方法二:使用groupby + unstack

修正你之前代码里的列名拼写错误(score_x/score_y而非scores_x/scores_y),先给数据添加分箱列再分组:

import pandas as pd

data = [[0,9], [10, 15], [11, 14],[1,3],[2,7],[4,31]]
df = pd.DataFrame(data, columns=['score_x', 'score_y'])

bins = [0,5,10,15,20,25,30]
# 添加分箱后的新列
df['x_bin'] = pd.cut(df['score_x'], bins=bins, right=False)
df['y_bin'] = pd.cut(df['score_y'], bins=bins, right=False)

# 分组计数并转为宽表,无数据的位置填充0
cross_table = df.groupby(['x_bin', 'y_bin']).size().unstack(fill_value=0)

# 重命名索引和列名,贴合你的示例格式
cross_table.index.name = 'score_x'
cross_table.columns.name = 'score_y'

print(cross_table)

关键说明

  • right=False:控制分箱区间为左闭右开,让区间显示为0-5这类直观格式,若不设置默认是右闭左开,区间会显示为(0,5],可按需调整。
  • dropna=False(方法一)或fill_value=0(方法二):确保所有分箱区间都被保留,避免遗漏无数据的分组。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 22:15:35