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

基于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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 23:20:38