如何在Pandas DataFrame中从指定日期开始计算cumsum()?
从指定日期开始计算Pandas累计求和(cumsum)
问题场景
现有如下Pandas DataFrame,已经能计算所有行的累计求和:
import pandas as pd df = pd.DataFrame([ {'Date': '2022-01-01', 'Confirmed': 7 }, {'Date': '2022-01-02', 'Confirmed': 4 }, {'Date': '2022-01-03', 'Confirmed': 12 }, {'Date': '2022-01-03', 'Confirmed': 2 }, {'Date': '2022-01-04', 'Confirmed': 9 }, {'Date': '2022-01-05', 'Confirmed': 10 }, ]) df["Total Confirmed"] = df["Confirmed"].cumsum()
但需要从特定日期(比如首次出现的2022-01-03)开始计算累计和,之前尝试shift()方法无效,因为它只按行数操作,没法按日期定位起始点。
解决方案
方法1:定位起始索引后调整计算
先找到目标日期首次出现的索引,再通过掩码将起始日期前的数值置为0,最后计算累计和:
import pandas as pd df = pd.DataFrame([ {'Date': '2022-01-01', 'Confirmed': 7 }, {'Date': '2022-01-02', 'Confirmed': 4 }, {'Date': '2022-01-03', 'Confirmed': 12 }, {'Date': '2022-01-03', 'Confirmed': 2 }, {'Date': '2022-01-04', 'Confirmed': 9 }, {'Date': '2022-01-05', 'Confirmed': 10 }, ]) # 找到目标日期首次出现的索引 start_idx = df[df['Date'] == '2022-01-03'].index[0] # 生成掩码:起始索引及之后的行标记为True mask = df.index >= start_idx # 起始日期前的Confirmed设为0,之后保留原值 df['Adjusted Confirmed'] = df['Confirmed'].where(mask, 0) # 计算累计和 df['Total Confirmed'] = df['Adjusted Confirmed'].cumsum()
方法2:分组累计(适合分段场景)
通过生成分组标记,仅对目标日期及之后的分组计算累计和:
import pandas as pd df = pd.DataFrame([ {'Date': '2022-01-01', 'Confirmed': 7 }, {'Date': '2022-01-02', 'Confirmed': 4 }, {'Date': '2022-01-03', 'Confirmed': 12 }, {'Date': '2022-01-03', 'Confirmed': 2 }, {'Date': '2022-01-04', 'Confirmed': 9 }, {'Date': '2022-01-05', 'Confirmed': 10 }, ]) # 生成分组标记:目标日期前为0,出现目标日期后变为1并保持 df['group'] = (df['Date'] == '2022-01-03').cumsum() # 仅对分组1及以后计算累计和,分组0的部分设为0 df['Total Confirmed'] = df.groupby('group')['Confirmed'].cumsum().where(df['group'] >= 1, 0)
两种方法最终效果一致:2022-01-01和2022-01-02的Total Confirmed为0,从2022-01-03开始累计,结果依次为12、14、23、33。
内容的提问来源于stack exchange,提问作者enter_display_name_here
相关产品推荐
相关产品推荐

