0

0

如何在 Pandas 中按组动态计算累计百分比(适配不同长度的连续 1 序列)

花韻仙語

花韻仙語

发布时间:2026-01-17 11:39:02

|

370人浏览过

|

来源于php中文网

原创

如何在 Pandas 中按组动态计算累计百分比(适配不同长度的连续 1 序列)

本文介绍一种高效、可扩展的方法,利用预定义百分比序列与分组索引技巧,在 pandas dataframe 中为每组连续的 `target=1` 行动态生成从起始值到 100 的等距累计百分比,并自动将 `target=0` 行设为 0。

在实际数据分析中,常需对二值标签(如 TARGET 列)中连续的正样本(1)进行归一化编号或进度映射。核心挑战在于:无论连续 1 的实际长度是 3、4 还是 6,最终都要“拉伸”至以 100 结尾的等比例序列——即不是固定步长 100/6 ≈ 16.67,而是根据当前连续段长度 n 动态采用步长 100/n,并取整后保证末项为 100。

例如,若某组 ID 下有 4 个连续 1,则应生成 [50, 66, 83, 100](对应 100/4 × [1,2,3,4] 取整),而非 [16, 33, 50, 66](错误地沿用 100/6 步长)。

✅ 正确实现方案

关键思路是:先识别每一段连续 1(按 ID 分组 + 检测 TARGET 变化),再对每段独立计算其专属的百分比序列。以下是完整、健壮的实现:

Evoker
Evoker

一站式AI创作平台

下载
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. 定义最大可能长度(仅用于预分配,非硬约束)
MAX_ONES = 6
# 预生成完整参考序列:[16, 33, 50, 66, 83, 100]
PCTS_FULL = [int(round(100 * i / MAX_ONES)) for i in range(1, MAX_ONES + 1)]

# 2. 标记连续 1 的区块(关键!避免跨零混淆)
# 使用 (ID, TARGET) 分组不够鲁棒;改用基于 TARGET 变化的块标识
df['block_id'] = (df['TARGET'] == 0).cumsum()  # 每次出现 0 就开启新块
df['is_one_block'] = df['TARGET'] == 1
# 仅对 TARGET==1 的行进行处理,其余 PERCENTAGE 默认为 0

# 3. 对每个连续 1 块独立计算动态百分比
def assign_dynamic_pct(group):
    n = len(group)  # 当前连续 1 的数量
    if n == 0:
        return pd.Series([], dtype='int')
    # 动态生成 n 项:100/n * [1, 2, ..., n] → 四舍五入取整,确保末项=100
    pct_vals = [int(round(100 * i / n)) for i in range(1, n + 1)]
    return pd.Series(pct_vals)

# 应用分块处理(注意:groupby 必须基于 block_id 且仅限 is_one_block=True)
mask_ones = df['is_one_block']
df.loc[mask_ones, 'PERCENTAGE'] = (
    df[mask_ones].groupby('block_id').apply(assign_dynamic_pct).explode().astype(int).values
)
# 未匹配的行(TARGET==0)自动保持 NaN,显式置 0
df['PERCENTAGE'] = df['PERCENTAGE'].fillna(0).astype(int)

print(df[['ID', 'TARGET', 'PERCENTAGE']])

输出示例:

   ID  TARGET  PERCENTAGE
0   A       1          50
1   A       1          66
2   A       1          83
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

⚠️ 注意事项与优化建议

  • 不要依赖 groupby(['ID', 'TARGET']):该方式会把所有 ID=A & TARGET=1 合并为一组,无法区分被 0 隔开的多个连续段(如 1,1,0,1,1 会被误认为 4 个连续 1)。
  • 使用 cumsum() 标记块更可靠:(df['TARGET']==0).cumsum() 在每次遇到 0 时递增,自然将每个 1 的连续段划分为独立 block_id。
  • 取整策略:round() 比 int() 更合理,避免因截断导致末项
  • 性能提示:对超大数据集,可向量化 assign_dynamic_pct(如用 np.arange + 广播),但上述方法已兼顾可读性与实用性。

该方案完全满足需求:任意长度的连续 1 序列,均能生成以 100 结尾、等比例分布的整数百分比列,且 0 值行始终为 0

相关专题

更多
Python 时间序列分析与预测
Python 时间序列分析与预测

本专题专注讲解 Python 在时间序列数据处理与预测建模中的实战技巧,涵盖时间索引处理、周期性与趋势分解、平稳性检测、ARIMA/SARIMA 模型构建、预测误差评估,以及基于实际业务场景的时间序列项目实操,帮助学习者掌握从数据预处理到模型预测的完整时序分析能力。

51

2025.12.04

string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

317

2023.08.02

int占多少字节
int占多少字节

int占4个字节,意味着一个int变量可以存储范围在-2,147,483,648到2,147,483,647之间的整数值,在某些情况下也可能是2个字节或8个字节,int是一种常用的数据类型,用于表示整数,需要根据具体情况选择合适的数据类型,以确保程序的正确性和性能。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

538

2024.08.29

c++怎么把double转成int
c++怎么把double转成int

本专题整合了 c++ double相关教程,阅读专题下面的文章了解更多详细内容。

52

2025.08.29

C++中int的含义
C++中int的含义

本专题整合了C++中int相关内容,阅读专题下面的文章了解更多详细内容。

197

2025.08.29

数据分析的方法
数据分析的方法

数据分析的方法有:对比分析法,分组分析法,预测分析法,漏斗分析法,AB测试分析法,象限分析法,公式拆解法,可行域分析法,二八分析法,假设性分析法。php中文网为大家带来了数据分析的相关知识、以及相关文章等内容。

465

2023.07.04

数据分析方法有哪几种
数据分析方法有哪几种

数据分析方法有:1、描述性统计分析;2、探索性数据分析;3、假设检验;4、回归分析;5、聚类分析。本专题为大家提供数据分析方法的相关的文章、下载、课程内容,供大家免费下载体验。

278

2023.08.07

网站建设功能有哪些
网站建设功能有哪些

网站建设功能包括信息发布、内容管理、用户管理、搜索引擎优化、网站安全、数据分析、网站推广、响应式设计、社交媒体整合和电子商务等功能。这些功能可以帮助网站管理员创建一个具有吸引力、可用性和商业价值的网站,实现网站的目标。

725

2023.10.16

高德地图升级方法汇总
高德地图升级方法汇总

本专题整合了高德地图升级相关教程,阅读专题下面的文章了解更多详细内容。

27

2026.01.16

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
CSS3 教程
CSS3 教程

共18课时 | 4.6万人学习

PostgreSQL 教程
PostgreSQL 教程

共48课时 | 7.3万人学习

Django 教程
Django 教程

共28课时 | 3.2万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号