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

如何让DataFrame中每组数值至少比前一组高3%?

Pandas生成满足递增百分比规则的列

原始DataFrame

import pandas as pd
df = pd.DataFrame(
    {
        'a': [100, 100, 102, 102, 106, 106, 106, 110, 110, 110]
    }
)

预期输出

a      b
0  100  100.00
1  100  100.00
2  102  103.00
3  102  103.00
4  106  106.09
5  106  106.09
6  106  106.09
7  110  110.00
8  110  110.00
9  110  110.00

处理规则

  • a) 按列a的相同值分组
  • b) 每组的b列值需满足:至少比前一组的b值高3%;若当前组a值达不到该要求,就用前一组b值×1.03作为当前组b值;若当前组a值超过计算值,则直接用a本身作为b值

我的尝试(思路有误)

df['streak'] = df.a.ne(df.a.shift(1)).cumsum()
df['b'] = df.groupby('streak')['a'].apply(lambda x: x * 1.03)

解决方案

要实现该逻辑,需先提取a的唯一分组并按顺序计算每组的b基准值,再映射回原DataFrame:

  1. 提取a的唯一值并保留原始顺序:
unique_a = df['a'].drop_duplicates().reset_index(drop=True)
  1. 逐个计算每个分组的b基准值:
b_values = [unique_a[0]]  # 第一组直接使用a的数值
for i in range(1, len(unique_a)):
    prev_b = b_values[-1]
    required = prev_b * 1.03
    if unique_a[i] >= required:
        b_values.append(unique_a[i])
    else:
        b_values.append(required)
  1. 创建a到b的映射字典:
a_to_b = dict(zip(unique_a, b_values))
  1. 将映射关系应用到原DataFrame生成b列:
df['b'] = df['a'].map(a_to_b).round(2)

执行上述代码后即可得到符合要求的输出。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.24 14:02:47