如何让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:
- 提取
a的唯一值并保留原始顺序:
unique_a = df['a'].drop_duplicates().reset_index(drop=True)
- 逐个计算每个分组的
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)
- 创建
a到b的映射字典:
a_to_b = dict(zip(unique_a, b_values))
- 将映射关系应用到原DataFrame生成
b列:
df['b'] = df['a'].map(a_to_b).round(2)
执行上述代码后即可得到符合要求的输出。
内容的提问来源于stack exchange,提问作者AmirX
相关产品推荐
相关产品推荐

