pandas实现将mask置零的原值累加到同分组下一月记录的value列
你需要先保留被mask匹配行的原始value值,再执行置零操作,再将该值累加到符合条件的下月记录中,实现代码如下:
import pandas as pd # 将month列转为datetime格式,方便计算下一月 df['month'] = pd.to_datetime(df['month'], format='%Y-%m') # 你的原始过滤条件 mask = ( (df.mapper == 'ABC') & (df.version == 'Alpha') & (df.country == 'USA') & (df.range == 'High') & (df.month == '2021-10') ) # 先存储被置零行的原始数值 mask_original_value = df.loc[mask, 'value'].iloc[0] # 执行置零操作 df.loc[mask, 'value'] = 0.0 # 构造下月行的匹配规则:同维度字段匹配+月份+1 group_columns = ['mapper', 'version', 'country', 'range'] mask_group_values = df.loc[mask, group_columns].iloc[0].to_dict() next_month = df.loc[mask, 'month'].iloc[0] + pd.DateOffset(months=1) # 匹配下月行并累加数值 next_month_mask = ( (df[list(mask_group_values.keys())] == pd.Series(mask_group_values)).all(axis=1) & (df['month'] == next_month) ) df.loc[next_month_mask, 'value'] += mask_original_value # 可选:将month列还原为字符串格式 df['month'] = df['month'].dt.strftime('%Y-%m')
如果你的mask会匹配多条需要置零的记录,可以用批量分组处理的方式:
import pandas as pd df['month'] = pd.to_datetime(df['month'], format='%Y-%m') group_columns = ['mapper', 'version', 'country', 'range'] # 存储原始值到临时列 df['original_value'] = df['value'] # 批量置零符合mask的行 df.loc[mask, 'value'] = 0 # 按维度分组,提取上一行被置零的数值到当前行的待加列 df['add_value'] = df.groupby(group_columns)['original_value'].shift(1).where(mask.shift(1, fill_value=False), 0) # 累加数值 df['value'] += df['add_value'] # 清理临时列 df = df.drop(columns=['original_value', 'add_value']) df['month'] = df['month'].dt.strftime('%Y-%m')
两种方式运行后都可以得到你预期的输出结果。
内容的提问来源于stack exchange,提问作者michael
相关产品推荐
相关产品推荐

