基于Pandas按项目对进度百分比进行十分位分箱并补全行
高效补全项目进度区间并汇总数据的方案
原始数据
import pandas as pd import numpy as np project = ['Project 1','Project 1','Project 1', 'Project 2', 'Project 2', 'Project 2', 'Project 2', 'Project 2', 'Project 2', 'Project 3', 'Project 3', 'Project 3', 'Project 3', 'Project 3'] progress = [33.3, 66.6, 100.0, 0, 16.6, 33.3, 50.0, 66.6, 83.3, 4.76, 9.52, 14.29, 95.2, 100.0] hours = [4, 2, 6, 0, 1, 3, 2, 0, 4, 1, 2, 3, 1, 3] taskcount = [1, 0, 5, 0, 4, 1, 3, 0, 1, 2, 1, 2, 2, 2] data = pd.DataFrame({'Project':project, 'Progress':progress, 'Hours':hours, 'TaskCount':taskcount})
需求说明
为每个项目补全**0.0%、10.0%、20.0%…100.0%**这11个十分位进度值,将原数据按对应区间(如(0.0%,10.0%]、(10.0%,20.0%]等,Progress=0单独对应0.0%)汇总Hours和TaskCount,生成完整的输出表,需支持高效处理27.8万行的大数据量。
解决方案
步骤1:定义进度区间与对应刻度
为每条数据匹配到目标补全的进度刻度:
# 定义区间:[-0.001,10)对应0.0%,[10,20)对应10.0%,…,[90,100]对应100.0% bins = np.concatenate([[-0.001], np.arange(10, 101, 10)]) # 对应目标刻度 labels = np.arange(0, 101, 10).astype(float) # 批量分配进度刻度 data['Progress_Tick'] = pd.cut(data['Progress'], bins=bins, labels=labels, include_lowest=True)
步骤2:按项目+进度刻度分组汇总
# 分组求和并重置索引,方便后续合并 summary = data.groupby(['Project', 'Progress_Tick'], as_index=False)[['Hours', 'TaskCount']].sum()
步骤3:生成完整组合并补全缺失数据
生成所有项目与所有进度刻度的笛卡尔积,再与汇总表合并,缺失值填充0:
# 获取所有唯一项目和进度刻度 all_projects = data['Project'].unique() all_ticks = labels # 生成完整的项目-进度组合 full_df = pd.DataFrame( index=pd.MultiIndex.from_product([all_projects, all_ticks], names=['Project', 'Progress_Tick']) ).reset_index() # 合并数据并填充缺失值 data_output = pd.merge(full_df, summary, on=['Project', 'Progress_Tick'], how='left').fillna(0)
关键优化点
- 全程使用pandas矢量化操作,避免循环,适配27.8万行的大数据量
- 用
pd.cut批量分配刻度,比自定义判断逻辑更高效 - 笛卡尔积生成+左合并的方式,比逐项目补全的方法更简洁高效
最终输出示例
data_output会包含每个项目的11条记录,每个进度刻度对应汇总后的工时和任务数,缺失区间的数值自动填充为0。
内容的提问来源于stack exchange,提问作者blargen
相关产品推荐
相关产品推荐

