You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 16:45:04