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

如何在Pandas中实现Excel的Col1_loss与Col3_loss计算逻辑?

在Pandas中实现Excel指定的col1_loss和col3_loss计算逻辑

问题背景

现有如下Pandas DataFrame:

import pandas as pd

data = {
    "Col1": [57600, 42375, 417225, 30600, 60375],
    "Col2": [9300, 9400, 9500, 9600, 9700],
    "Col3": [802350, 950700, 2800875, 1170300, 1616175]
}
df = pd.DataFrame(data)

需要计算col1_loss和col3_loss两个新列,对应Excel中的计算逻辑:

  • col1_loss 公式:

    =IFERROR($B2*SUM(A2:$A$2)-SUMPRODUCT($B2:B$2,$A2:A$2),0)
    

    (Excel中A列对应Col1,B列对应Col2)

  • col3_loss 公式:

    =IFERROR(SUMPRODUCT($B2:B$14,$C2:C$14)-$B2*SUM($C2:C$14),0)
    

    (Excel中B列对应Col2,C列对应Col3,$B$14为数据最后一行)

注意:DataFrame行数为30-70的可变值,需适配任意行数。

解决方案

1. 计算col1_loss

Excel公式核心逻辑:对当前行及以上所有行,计算当前行Col2 × 上方所有Col1的和减去Col2与Col1对应乘积的和,计算出错时返回0。

在Pandas中用expanding窗口实现,高效且适配任意行数:

df['col1_loss'] = (
    df['Col2'] * df['Col1'].expanding().sum()
    - (df['Col2'] * df['Col1']).expanding().sum()
).fillna(0)

2. 计算col3_loss

Excel公式核心逻辑:对当前行及以下所有行,计算Col2与Col3对应乘积的和减去当前行Col2 × 下方所有Col3的和,计算出错时返回0。

通过反转DataFrame实现反向累积计算,再还原顺序:

# 反转DataFrame,计算反向expanding值
reversed_df = df[['Col2', 'Col3']][::-1].reset_index(drop=True)
sum_col3_rev = reversed_df['Col3'].expanding().sum()
sum_product_rev = (reversed_df['Col2'] * reversed_df['Col3']).expanding().sum()

# 计算反向的col3_loss后,还原为原顺序
col3_loss_rev = sum_product_rev - reversed_df['Col2'] * sum_col3_rev
df['col3_loss'] = col3_loss_rev[::-1].reset_index(drop=True).fillna(0)

完整验证代码

import pandas as pd

data = {
    "Col1": [57600, 42375, 417225, 30600, 60375],
    "Col2": [9300, 9400, 9500, 9600, 9700],
    "Col3": [802350, 950700, 2800875, 1170300, 1616175]
}
df = pd.DataFrame(data)

# 计算col1_loss
df['col1_loss'] = (
    df['Col2'] * df['Col1'].expanding().sum()
    - (df['Col2'] * df['Col1']).expanding().sum()
).fillna(0)

# 计算col3_loss
reversed_df = df[['Col2', 'Col3']][::-1].reset_index(drop=True)
sum_col3_rev = reversed_df['Col3'].expanding().sum()
sum_product_rev = (reversed_df['Col2'] * reversed_df['Col3']).expanding().sum()
col3_loss_rev = sum_product_rev - reversed_df['Col2'] * sum_col3_rev
df['col3_loss'] = col3_loss_rev[::-1].reset_index(drop=True).fillna(0)

print(df)

运行后会得到包含目标列的完整DataFrame,且代码支持任意行数的输入数据。


内容的提问来源于stack exchange,提问作者Brijesh Chaurasia

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 15:52:39