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

如何在Pandas DataFrame中按ID分组逐行计算Qty_2减Qty_1并更新后续行

Pandas按ID分组更新Qty_2列的两种实现方案

前置准备:构造测试数据

import pandas as pd

# 构造和示例一致的DataFrame
df = pd.DataFrame({
    'ID': ['A', 'A', 'A', 'B', 'B', 'B'],
    'Qty_1': [1, 2, 3, 3, 2, 1],
    'Qty_2': [10, 0, 0, 29, 0, 0]
})

需求1:分组首行保留原始Qty_2,后续行用上一行Qty_2减当前行Qty_1更新

自定义函数实现

def calc_v1(group):
    # 取当前ID组首行的原始Qty_2作为初始值
    init_qty2 = group['Qty_2'].iloc[0]
    # 生成扣减累计值:首行不扣减,后续行累计当前行的Qty_1
    cum_deduct = group['Qty_1'].mask(group.cumcount() == 0, 0).cumsum()
    group['Qty_2'] = init_qty2 - cum_deduct
    return group

df_result1 = df.groupby('ID', group_keys=False).apply(calc_v1)

一行简写实现

df['Qty_2'] = df.groupby('ID')['Qty_2'].transform('first') - df['Qty_1'].mask(df.groupby('ID').cumcount() == 0, 0).groupby(df['ID']).cumsum()

需求2:分组首行先扣减当前行Qty_1,后续行按相同规则更新

自定义函数实现

def calc_v2(group):
    # 取当前ID组首行的原始Qty_2作为初始值
    init_qty2 = group['Qty_2'].iloc[0]
    # 生成扣减累计值:从首行开始累计所有行的Qty_1
    cum_deduct = group['Qty_1'].cumsum()
    group['Qty_2'] = init_qty2 - cum_deduct
    return group

df_result2 = df.groupby('ID', group_keys=False).apply(calc_v2)

一行简写实现

df['Qty_2'] = df.groupby('ID')['Qty_2'].transform('first') - df.groupby('ID')['Qty_1'].cumsum()

内容的提问来源于stack exchange,提问作者Filipe Carvalho

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.23 21:45:02