如何在Pandas DataFrame中高效对分数分桶并按日期分组
自定义分数分箱分组的高效实现方法
看你现在需要给分数按自定义区间分箱,然后按日期统计每个区间的人数,原来手动累加单个分数列的做法确实繁琐又容易出错,这里有个更简洁高效的实现方式:
示例数据
先还原你的示例数据:
import pandas as pd data = { 'Id': [1,2,3,4,5,6,7,8,9,10], 'Date': ['2018-01-01']*5 + ['2018-01-02']*5, 'Score': [56,72,91,67,65,75,72,91,82,81] } df = pd.DataFrame(data)
实现步骤
1. 定义分箱规则
先明确我们的分箱区间和对应的标签:
# 分箱区间:(-∞,60), [60,80), [80,100] bins = [-float('inf'), 60, 80, 100] # 对应区间的显示标签 labels = ['<60', '60-79', '80-100']
2. 给分数列打分箱标签
用pd.cut把每个分数映射到对应的区间标签:
# right=False 表示区间左闭右开,比如60会被分到60-79区间 df['Score_Bin'] = pd.cut(df['Score'], bins=bins, labels=labels, right=False)
3. 按日期统计各区间人数
这里有两种简单的方式实现:
方式一:使用交叉表pd.crosstab
result = pd.crosstab(df['Date'], df['Score_Bin']) # 确保所有标签列都存在(避免某个区间无数据时列缺失) result = result.reindex(labels, axis=1)
方式二:使用分组统计groupby + value_counts
result = df.groupby('Date')['Score_Bin'].value_counts().unstack(fill_value=0) result = result.reindex(labels, axis=1)
最终输出结果
两种方法都会得到你想要的格式:
| Date | <60 | 60-79 | 80-100 |
|---|---|---|---|
| 2018-01-01 | 1 | 3 | 1 |
| 2018-01-02 | 0 | 2 | 3 |
这个方法的好处是:不管分数范围怎么变,只需要修改bins和labels就能快速调整分箱规则,不用再手动累加几十个分数列,代码更易维护也更不容易出错~
内容的提问来源于stack exchange,提问作者Nabih Bawazir
相关产品推荐
相关产品推荐

