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

如何在Pandas中按组将行内超额值均匀分摊至同组后续行?

实现DataFrame分组首行超阈值数值的均匀分摊

问题背景

给定如下结构的DataFrame:

IDNamecount
1A75
2B10
3A15
4A10
5A5
6A3

要求设置count阈值为15,将同组(按Name分组)中首行超过阈值的数值均匀分摊至同组后续行,首行保留阈值,最终得到如下结果:

IDNamecount
1A15
2B10
3A30
4A25
5A20
6A18

具体逻辑:ID=1的Name=A行超出阈值的部分为75-15=60,需均匀分摊至后续4行Name=A的记录中。

实现代码

使用Pandas可以通过分组自定义函数实现该需求,代码如下:

import pandas as pd

# 构造示例DataFrame
df = pd.DataFrame({
    'ID': [1, 2, 3, 4, 5, 6],
    'Name': ['A', 'B', 'A', 'A', 'A', 'A'],
    'count': [75, 10, 15, 10, 5, 3]
})

threshold = 15

def process_group(group):
    group = group.copy()
    first_count = group['count'].iloc[0]
    if first_count > threshold:
        excess = first_count - threshold
        # 首行保留阈值
        group['count'].iloc[0] = threshold
        num_subsequent = len(group) - 1
        if num_subsequent > 0:
            # 计算每行分摊量及余数
            per_row = excess // num_subsequent
            remainder = excess % num_subsequent
            # 后续行加上基础分摊量
            group['count'].iloc[1:] += per_row
            # 余数加到最后一行
            if remainder > 0:
                group['count'].iloc[-1] += remainder
    return group

# 分组处理并恢复原顺序
result_df = df.groupby('Name', group_keys=False).apply(process_group)
result_df = result_df.sort_values('ID').reset_index(drop=True)

print(result_df)

代码说明

  1. 分组处理逻辑:对每个Name分组,先判断首行count是否超过阈值,若超过则计算超出部分。
  2. 分摊规则:将超出部分平均分配给后续行,若无法整除,余数直接加到最后一行(示例中60刚好能被4整除,故无余数)。
  3. 顺序保持:分组处理后按ID重新排序,保证结果顺序与原数据一致。

内容的提问来源于stack exchange,提问作者python_interest

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 23:31:46