基于当前行值的Pandas条件求和实现方案咨询
解决方案
可以通过Pandas的内置合并、筛选和分组操作实现,全程无需自定义函数或循环:
步骤说明
- 给原数据添加临时索引,方便后续匹配结果并排除自身行
- 将数据与自身按
employeeID和groupName做内连接,生成同组内所有行的笛卡尔积配对 - 筛选出非自身行且
expiryDate>= 当前行agreementDate的记录 - 按原数据的索引分组,对符合条件的
vesting_value_CAD求和 - 将求和结果合并回原数据,对无符合条件行的记录填充0
代码示例
import pandas as pd # 模拟你的原始数据 data = { 'employeeID': ['E1', 'E1', 'E1', 'E2'], 'groupName': ['G1', 'G1', 'G1', 'G2'], 'agreementID': ['A1', 'A2', 'A3', 'A4'], 'agreementDate': pd.to_datetime(['2020-01-01', '2021-01-01', '2022-01-01', '2020-01-01']), 'vesting_value_CAD': [100, 200, 40, 50], 'expiryDate': pd.to_datetime(['2023-01-01', '2024-01-01', '2025-01-01', '2026-01-01']) } df = pd.DataFrame(data) # 添加临时索引 df = df.reset_index(names='orig_index') # 同组内生成所有行配对 merged = df.merge(df, on=['employeeID', 'groupName'], suffixes=('_orig', '_other')) # 筛选符合条件的配对 filtered = merged[ (merged['orig_index_orig'] != merged['orig_index_other']) & (merged['expiryDate_other'] >= merged['agreementDate_orig']) ] # 按原索引分组求和 sum_result = filtered.groupby('orig_index')['vesting_value_CAD_other'].sum().reset_index( names='sum_vesting_CAD' ) # 合并回原数据并处理空值 final_df = df.merge(sum_result, on='orig_index', how='left').fillna({'sum_vesting_CAD': 0}).drop(columns='orig_index') print(final_df)
输出结果
employeeID groupName agreementID agreementDate vesting_value_CAD expiryDate sum_vesting_CAD 0 E1 G1 A1 2020-01-01 100 2023-01-01 240 1 E1 G1 A2 2021-01-01 200 2024-01-01 40 2 E1 G1 A3 2022-01-01 40 2025-01-01 0 3 E2 G2 A4 2020-01-01 50 2026-01-01 0
内容的提问来源于stack exchange,提问作者Titi
相关产品推荐
相关产品推荐

