如何在Python中对DataFrame指定列的重复数据应用乘法因子?
解决方案:处理DataFrame中连续重复组的衰减计算
先看示例数据:
原始表A
| Index | Bird1 | Bird2 |
|---|---|---|
| 0 | 8 | 10 |
| 1 | 8 | 10 |
| 2 | 8 | 5 |
| 3 | 4 | 5 |
| 4 | 4 | 5 |
| 5 | 2 | 3 |
期望结果表B
| Index | Bird1 | Bird2 |
|---|---|---|
| 0 | 8 | 10 |
| 1 | 4 | 5 |
| 2 | 2 | 5 |
| 3 | 4 | 5 |
| 4 | 2 | 2.5 |
| 5 | 2 | 3 |
为什么df.interpolate()不适用?
interpolate()是用来填充缺失值的插值工具,逻辑是基于相邻非缺失值做线性/多项式等插值,完全不符合我们需要的“从连续重复组的第一个值开始,依次乘0.5衰减”的需求,直接排除这个方法。
代码实现思路
核心是先识别每一列的连续重复分组,再对长度大于1的分组生成衰减序列替换原重复值:
- 给目标列生成连续重复组的ID:通过判断当前值与上一行是否不同,累计分组编号;
- 对每个分组处理:长度为1则保留原值,长度>1则从第一个值开始,依次按
上一次结果×0.5生成新序列; - 将处理后的序列替换回原DataFrame。
完整代码
import pandas as pd # 原始数据 df = pd.DataFrame({ 'Bird1': [8, 8, 8, 4, 4, 2], 'Bird2': [10, 10, 5, 5, 5, 3] }) def process_repeating_groups(col, k=0.5): # 生成连续重复组的唯一ID group_ids = col.ne(col.shift()).cumsum() # 对每个分组生成衰减序列 processed = col.groupby(group_ids).transform(lambda x: x.iloc[0] * (k ** pd.Series(range(len(x)))) ) return processed # 处理目标列 df['Bird1'] = process_repeating_groups(df['Bird1']) df['Bird2'] = process_repeating_groups(df['Bird2']) print(df)
运行结果
Bird1 Bird2 0 8.0 10.00 1 4.0 5.00 2 2.0 5.00 3 4.0 5.00 4 2.0 2.50 5 2.0 3.00
代码解释
col.ne(col.shift()).cumsum():判断当前行与上一行值是否不同,不同则生成新的分组ID,把连续相同的值归为同一组;groupby(group_ids).transform(...):对每个分组应用变换,x.iloc[0] * (k ** pd.Series(range(len(x))))生成的序列,第一个元素是原值(k^0=1),第二个是原值×0.5,第三个是原值×0.5²,完全匹配需求;- 该方法不依赖
df.ne(0),无论重复值是否为0都能处理,适用性更强。
内容的提问来源于stack exchange,提问作者gveronese
相关产品推荐
相关产品推荐

