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

如何在Python中对DataFrame指定列的重复数据应用乘法因子?

解决方案:处理DataFrame中连续重复组的衰减计算

先看示例数据:

原始表A

IndexBird1Bird2
0810
1810
285
345
445
523

期望结果表B

IndexBird1Bird2
0810
145
225
345
422.5
523

为什么df.interpolate()不适用?

interpolate()是用来填充缺失值的插值工具,逻辑是基于相邻非缺失值做线性/多项式等插值,完全不符合我们需要的“从连续重复组的第一个值开始,依次乘0.5衰减”的需求,直接排除这个方法。

代码实现思路

核心是先识别每一列的连续重复分组,再对长度大于1的分组生成衰减序列替换原重复值:

  1. 给目标列生成连续重复组的ID:通过判断当前值与上一行是否不同,累计分组编号;
  2. 对每个分组处理:长度为1则保留原值,长度>1则从第一个值开始,依次按上一次结果×0.5生成新序列;
  3. 将处理后的序列替换回原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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 04:02:19