首次使用Pandas:实现项目累计至0停止及跨行累加需求
Pandas累计求和问题解决方案
嘿,刚接触Pandas就能尝试这种定制化的累计操作,值得点赞!我来帮你搞定这两个需求,咱们一步步拆解:
第一步:先还原你的DataFrame
首先咱们先把你提到的小型DataFrame构建出来,方便后续操作:
import pandas as pd # 你的原始数据 data = { 'Date': ['12/10/2017', '12/11/2017', '12/12/2017'], 'project1': [100, 0, 0], 'project2': [200, 100, 0], 'project3': [300, 100, 100] } df = pd.DataFrame(data)
需求1:每个项目执行cumsum,遇到0时停止
这里的核心逻辑是:一旦某个项目的某一行出现0,后续所有行的累计值都保持到第一个0之前的累计结果。我们可以通过自定义函数结合apply来实现:
def cumsum_stop_at_zero(series): # 找到当前项目列中第一个0的索引 first_zero_index = series[series == 0].index.min() if pd.isna(first_zero_index): # 如果列中没有0,直接返回正常的累计求和 return series.cumsum() else: # 先计算完整的累计求和 cumulative_sum = series.cumsum() # 把第一个0及之后的所有行,替换成第一个0前一行的累计值 cumulative_sum.loc[first_zero_index:] = cumulative_sum.loc[first_zero_index - 1] return cumulative_sum # 对所有项目列应用这个函数,保留Date列 project_columns = ['project1', 'project2', 'project3'] df_cumsum_stop = df[['Date']].join(df[project_columns].apply(cumsum_stop_at_zero)) print(df_cumsum_stop)
执行后输出结果:
Date project1 project2 project3 0 12/10/2017 100 200 300 1 12/11/2017 100 300 400 2 12/12/2017 100 300 500
可以看到:
- project1在第1行出现0,后续累计值保持100不变
- project2在第2行出现0,累计值停在300
- project3没有0,所以正常累计到500
需求2:对所有项目进行跨行(按行)累计求和
这里的跨行累计求和,我理解为从第一行到当前行,所有项目的数值总和的累计。实现起来很简单:
# 先计算每行的所有项目总和 df['row_total'] = df[project_columns].sum(axis=1) # 再对每行总和执行跨行累计求和 df['cumulative_total'] = df['row_total'].cumsum() print(df[['Date', 'row_total', 'cumulative_total']])
执行后输出结果:
Date row_total cumulative_total 0 12/10/2017 600 600 1 12/11/2017 200 800 2 12/12/2017 100 900
如果需要把每个项目的累计和也整合进去,也可以直接基于需求1的结果,计算每行的累计总和:
df_cumsum_stop['total_cumulative'] = df_cumsum_stop[project_columns].sum(axis=1) print(df_cumsum_stop)
输出:
Date project1 project2 project3 total_cumulative 0 12/10/2017 100 200 300 600 1 12/11/2017 100 300 400 800 2 12/12/2017 100 300 500 900
内容的提问来源于stack exchange,提问作者FancyDolphin
相关产品推荐
相关产品推荐

