如何对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
相关产品推荐
相关产品推荐

