如何在 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; ?>
】
相关推荐
- php报错怎么查看_定位PHP致命错误与警告的方法
- c++怎么编写动态链接库dll_c++ __dec
- 如何将竖排文本文件转换为横排字符串
- Mac如何设置动态壁纸?(让桌面动起来)
- php嵌入式日志记录怎么实现_php将硬件数据写入
- c++ nullptr与NULL区别_c++11空
- c# 在ASP.NET Core中管理和取消后台任
- Win11怎么关闭搜索历史_Win11清除任务栏搜
- Win11怎么设置默认图片查看器_Windows1
- Windows10电脑怎么查看硬盘通电时间_Win
- Win11怎样安装搜狗输入法_Win11安装搜狗输
- 如何使用Golang反射将map转换为struct
- Win11如何隐藏桌面图标 Win11一键隐藏/显
- Win10如何设置双wan路由器 Win10双wa
- php打包exe后无法读取环境变量_变量配置方法【
- php订单日志怎么导出excel_php导出订单日
- Win10文件历史记录怎么用 Win10开启自动备
- Windows10如何更改桌面图标间距_Win10
- Win11怎么设置虚拟内存_Windows 11优
- 如何在Golang中处理JSON字段缺失_Gola
- 如何从 Go 的 map[string]inter
- 短链接怎么用php递归还原_多层加密链接的处理法【
- php本地部署支持nodejs吗_php与node
- 如何在 Go 中创建包含 map 的 slice(
- 本地php环境出现502错误_nginx或apac
- Windows10如何删除Windows.old_
- Win11怎么开启HDR模式_Windows 11
- VSC怎样在Linux运行PHP_Ubuntu系统
- Win11怎么更改计算机名_Windows11系统
- 如何在Golang中使用encoding/gob序
- Win11怎么恢复旧版开始菜单_通过软件还原Win
- 如何解决Windows字体显示模糊的问题?(Cle
- 如何在Golang中实现RPC异步返回_Golan
- Windows11怎么自定义任务栏_Windows
- GML (Geography Markup Lan
- 如何在JavaScript中动态拼接PHP的bas
- php增删改查在php8里有什么变化_新特性对cu
- Mac怎么给文件夹加密_Mac创建加密磁盘映像教程
- Win11开机自检怎么关闭_跳过Win11开机磁盘
- Win10如何卸载自带Edge_Win10彻底卸载
- php485返回空数组怎么回事_php485数据接
- Win11怎样安装企业微信_Win11安装企业微信
- Windows10如何更改系统字体大小_Win10
- Windows10电脑怎么设置文件权限_Win10
- LINUX怎么设置系统语言_LINUX修改中文环境
- Win11怎么关闭粘滞键_彻底禁用Windows
- Win11蓝牙开关不见了怎么办_Win11蓝牙驱动
- c++中的CRTP是什么 c++奇异递归模板模式【
- C++ STL算法库怎么用?C++常用算法函数(s
- Go 中实现 Python urllib.quot


QQ客服