如何在 Pandas 中按组动态计算递增百分比并确保末位恒为 100
技术百科
心靈之曲
发布时间:2026-01-17
浏览: 次 本文介绍一种高效方法:对每组连续的 `1`(最多 6 个)动态分配递增百分比值,使最后一个 `1` 对应 100%,无论实际连续长度是否小于 6;`0` 则统一置为 0。
要实现这一目标,关键在于不依赖固定步长(如 100/6 累加),而是根据每段连续 1 的真实长度动态生成等距百分比序列,并保证末项严格为 100。原始方案中硬编码 100/6 导致短序列无法触达 100,而正确解法需先识别每段连续 1 的边界,再按其实际长度缩放比例。
以下是推荐的完整实现(兼容多 ID 分组、自动处理变长连续段):
import pandas as pd
import numpy as np
# 示例数据(含多个 ID 和不同长度的连续 1)
df = pd.DataFrame({
'ID': ['A', 'A', 'A', 'A', 'A', 'A', 'A', 'B', 'B', 'B', 'B'],
'TARGET': [1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 0]
})
# 步骤 1:识别连续块(基于 TARGET 变化)
df['block_id'] = (df['TARGET'] != df['TARGET'].shift()).cumsum()
# 步骤 2:仅对 TARGET == 1 的块计算累计序号(从 1 开始)
mask_ones = df['TARGET'] == 1
df.loc[mask_ones, 'rank_in_block'] = df[mask_ones].groupby('block_id').cumcount() + 1
# 步骤 3:获取每块中 1 的总数(即块长度)
block_lengths = df[mask_ones].groupby('block_id')['TARGET'].transform('size')
# 步骤 4:动态计算百分比:(rank / total_length) * 100 → 向下取整(或四舍五入)
df['PERCENTA
GE'] = np.where(
mask_ones,
((df['rank_in_block'] / block_lengths) * 100).round().astype(int),
0
)
print(df[['ID', 'TARGET', 'PERCENTAGE']])输出示例:
ID TARGET PERCENTAGE 0 A 1 25 1 A 1 50 2 A 1 75 3 A 1 100 4 A 0 0 5 A 0 0 6 A 0 0 7 B 1 33 8 B 1 66 9 B 1 100 10 B 0 0
✅ 核心优势:
- 自动适配任意长度的连续 1 段(1~6 均可),始终以 100% 收尾;
- 支持多 ID 分组,各组独立计算互不影响;
- 使用向量化操作,性能优于循环或 apply;
- round().astype(int) 确保整数输出(如需保留小数可移除 .astype(int))。
⚠️ 注意事项:
- 若数据中存在 TARGET 非 0/1 值,需提前清洗或扩展 mask_ones 条件;
- 连续块识别依赖 TARGET 列顺序,确保数据已按业务逻辑排序(如时间戳);
- 如需严格匹配原题中 [16, 33, 50, 66, 83, 100] 的离散值(而非线性插值),可改用预定义映射表 + map,但会牺牲灵活性。
该方法兼顾准确性、可读性与扩展性,是处理动态比例填充任务的稳健实践。
# 多个
# 移除
# 最多
# 均可
# 而非
# 如需
# 关键在于
# app
# 这一目标
# 循环
# int
# 编码
# map
# 再按
# pandas
# 每组
相关栏目:
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
AI推广<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
SEO优化<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
技术百科<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
谷歌推广<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
百度推广<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
网络营销<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
案例网站<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
精选文章<?muma echo $count; ?>
】
相关推荐
- c++如何使用std::bind绑定函数参数_c+
- VSC怎样在Linux运行PHP_Ubuntu系统
- Win11怎么卸载Photos应用_Win11卸载
- 如何用列表一次性对 DataFrame 的指定列应
- Win11笔记本怎么看电池健康度_Win11电池报
- Laravel 查询 JSON 列:高效筛选包含数
- 如何在Golang中使用encoding/gob序
- 如何在Golang中定义接口_抽象方法和多态实现
- Win11如何设置环境变量 Win11添加和修改系
- php查询数据怎么分组_groupby分组查询配合
- Win11怎么快速锁屏_Win11一键锁屏快捷键W
- Win10怎样设置闹钟贪睡时间 Win10闹钟贪睡
- Win10怎样清理C盘浏览器缓存_Win10清理浏
- 如何使用Golang模拟请求超时_Golang c
- c++如何连接Redis c++ hiredis库
- PHP接收参数值为空怎么办_判断和处理空参数方法说
- c++中如何对数组进行排序_c++数组排序算法汇总
- c# 如何深拷贝和浅拷贝
- Win11怎么连接蓝牙耳机_Win11蓝牙设备配对
- Windows10系统怎么查看设备管理器_Win1
- Drupal 中 HTML 链接被重复转义导致渲染
- 如何使用Golang table-driven基准
- 如何使用Golang搭建本地API测试环境_快速验
- c++20的std::format怎么用 比pri
- Win11怎么关闭任务栏小组件_Windows11
- C#如何序列化对象为XML XmlSerializ
- Windows10电脑怎么设置虚拟光驱_Win10
- php增删改查在php8里有什么变化_新特性对cu
- PowerShell怎么创建复杂的XML结构
- php删除数据怎么加限制_带where条件删除避免
- php命令行怎么运行_通过CLI模式执行PHP脚本
- Win11怎么设置开机密码_Windows11账户
- Win11怎么打开注册表_Windows 11注册
- php485函数执行慢怎么优化_php485性能提
- Win11怎么打开旧版计算器_Win11恢复传统计
- Go 中 defer 语句在 goroutine
- Windows10如何查看蓝屏日志_Win10使用
- Python变量绑定机制_引用模型解析【教程】
- Windows10系统怎么查看系统版本_Win10
- c++中的std::conjunction和std
- Win11怎么检查TPM2.0模块_Windows
- php打包exe后无法读取环境变量_变量配置方法【
- Win11怎么把图标拖到任务栏_Win11固定应用
- Win10如何备份注册表_Win10注册表备份步骤
- Windows10如何删除恢复分区_Win10 D
- Win10怎样卸载自带Edge_Win10卸载Ed
- 如何在 Go 中比较自定义的数组类型(如 [20]
- Windows怎样关闭桌面弹窗广告_Windows
- php485能和物联网模块通信吗_php485对接
- Win11怎么设置快速访问主页_Windows11


QQ客服