基于ID分组与有效期筛选,用Pandas计算修正后总计值
Pandas解决方案:按ID分组计算修正后总额(AmendedTotal)
以下是适配PowerBI PowerQuery Python编辑器的代码,完全匹配你的需求逻辑:
import pandas as pd from datetime import datetime # 复制PowerQuery传入的数据集 df = dataset.copy() # 1. 将Expiry Date转换为datetime类型(匹配示例中的mm/dd/yy格式) df['Expiry Date'] = pd.to_datetime(df['Expiry Date'], format='%m/%d/%y') # 2. 定义日期区间:今日(仅保留日期部分)和6个月后的日期 today = pd.Timestamp(datetime.today().date()) six_months_later = today + pd.DateOffset(months=6) # 3. 按ID分组计算每个ID的AmendedTotal def compute_amended(group): # 同一ID的Total值默认一致,取第一个即可 base_total = group['Total'].iloc[0] # 筛选有效期在今日至6个月后的行 eligible_rows = group[(group['Expiry Date'] >= today) & (group['Expiry Date'] <= six_months_later)] # 计算需要扣除的总额 total_deduction = (eligible_rows['Total'] * eligible_rows['Percent of Total']).sum() # 返回修正后总额 return base_total - total_deduction # 分组计算并生成ID与AmendedTotal的映射 amended_map = df.groupby('ID').apply(compute_amended).reset_index(name='AmendedTotal') # 4. 将修正后总额合并回原数据集 df = df.merge(amended_map, on='ID', how='left') # 输出处理后的数据集给PowerQuery df
关键逻辑说明
- 日期格式处理:通过
pd.to_datetime将字符串类型的到期日转为datetime,确保日期比较的准确性;如果你的日期格式是dd/mm/yy,只需将format='%m/%d/%y'改为format='%d/%m/%y'。 - 区间计算:用
pd.DateOffset精确计算6个月后的日期,避免手动计算月份的误差。 - 分组计算:自定义函数处理每个ID的分组,筛选符合条件的行后计算扣除总额,最终得到每个ID统一的修正后总额。
- 合并数据:通过
merge将修正后总额关联到原数据集的每一行,保证同一ID的所有行拥有相同的AmendedTotal。
内容的提问来源于stack exchange,提问作者Zakria Ghani
相关产品推荐
相关产品推荐

