Pandas基于指定小时分段列表为DataFrame新增category列的实现问题
Pandas 新增category列实现方案
完整可运行代码
import pandas as pd # 构造原始数据 data = { "hours": [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23], "values": [0, 1, 1, 1, 0, 1, 1, 1, 0, 1, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 1, 1, 1] } df = pd.DataFrame(data) # 预设小时边界列表 bounds = [2, 4, 6, 8, 10, 16, 18, 21, 23] # 预处理分箱边界:微调末尾值以覆盖整数23 bins = bounds.copy() bins[-1] += 0.1 # 按边界分箱,自动分配区间编号,无归属区间的填充0 df['temp_cat'] = pd.cut( df['hours'], bins=bins, labels=range(1, len(bounds)), right=False ).fillna(0) # 结合values列做掩码,生成最终category列 df['category'] = df['temp_cat'].astype(int) * df['values'] # 清理临时列 df = df.drop(columns=['temp_cat'])
运行结果
执行上述代码后,df的输出如下:
hours values category 0 1 0 0 1 2 1 1 2 3 1 1 3 4 1 2 4 5 0 0 5 6 1 3 6 7 1 3 7 8 1 4 8 9 0 0 9 10 1 5 10 11 0 0 11 12 0 0 12 13 0 0 13 14 0 0 14 15 0 0 15 16 1 6 16 17 1 6 17 18 1 7 18 19 0 0 19 20 0 0 20 21 1 8 21 22 1 8 22 23 1 8
逻辑说明
- 该方案无需依赖groupby,需求本质是按预设固定边界做区间划分,属于典型分箱场景,
pd.cut可直接匹配规则 - 配置
right=False将区间定义为左闭右开,避免相邻边界的重叠冲突,每个小时值仅归属一个区间 - 仅对最后一个边界加0.1做微调,不修改原有边界数值,即可让整数小时23被纳入最后一个区间
- 区间编号与values列相乘的运算自动实现掩码效果:values为0的位置结果直接置0,values为1的位置保留对应区间编号,完全符合赋值规则
内容的提问来源于stack exchange,提问作者Dave Will
相关产品推荐
相关产品推荐

