如何在Pandas中按组将行内超额值均匀分摊至同组后续行?
实现DataFrame分组首行超阈值数值的均匀分摊
问题背景
给定如下结构的DataFrame:
| ID | Name | count |
|---|---|---|
| 1 | A | 75 |
| 2 | B | 10 |
| 3 | A | 15 |
| 4 | A | 10 |
| 5 | A | 5 |
| 6 | A | 3 |
要求设置count阈值为15,将同组(按Name分组)中首行超过阈值的数值均匀分摊至同组后续行,首行保留阈值,最终得到如下结果:
| ID | Name | count |
|---|---|---|
| 1 | A | 15 |
| 2 | B | 10 |
| 3 | A | 30 |
| 4 | A | 25 |
| 5 | A | 20 |
| 6 | A | 18 |
具体逻辑: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)
代码说明
- 分组处理逻辑:对每个
Name分组,先判断首行count是否超过阈值,若超过则计算超出部分。 - 分摊规则:将超出部分平均分配给后续行,若无法整除,余数直接加到最后一行(示例中60刚好能被4整除,故无余数)。
- 顺序保持:分组处理后按
ID重新排序,保证结果顺序与原数据一致。
内容的提问来源于stack exchange,提问作者python_interest
相关产品推荐
相关产品推荐

