如何根据pandas中另一列数值变化计算带惩罚因子的列求和
实现带有分组变化惩罚因子的求和计算
首先定义你的DataFrame:
import pandas as pd data = { 'col_1': [4.0, 4.0, 49.0, 49.0, 49.0, 52.0, 52.0], 'val_1': [0.89, 0.56, 0.7, 1.23, 0.8, 0.5, 0.2] } df = pd.DataFrame(data)
方法一:基于总和减去惩罚总额
核心思路:每次col_1发生变化时,对应前一组最后一行的val_1减0.4,等价于总求和值减去0.4乘以变化次数。
代码:
# 计算val_1原始总和 total_raw = df['val_1'].sum() # 统计col_1的变化次数(排除第一行的初始NaN对比) change_count = df['col_1'].ne(df['col_1'].shift()).iloc[1:].sum() # 计算带惩罚的总和 total = total_raw - 0.4 * change_count print(total) # 输出4.08
方法二:逐行调整后求和
核心思路:标记出需要应用惩罚的行(每个col_1分组的最后一行,且不是整个DataFrame的最后一行),对这些行的val_1减0.4后再求和。
代码:
# 标记每个分组的最后一行 df['is_last_in_group'] = df.groupby('col_1').cumcount(ascending=False) == 0 # 标记需要惩罚的行:分组最后一行且不是整个数据的最后一行 df['need_penalty'] = df['is_last_in_group'] & (df['col_1'] != df['col_1'].iloc[-1]) # 计算调整后的值 df['adjusted_val'] = df['val_1'] - df['need_penalty'] * 0.4 # 求和 total = df['adjusted_val'].sum() print(total) # 输出4.08
内容的提问来源于stack exchange,提问作者EngGu
相关产品推荐
相关产品推荐

