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

如何不使用for loop按类别连续更新DataFrame的Constant列?

问题描述

我有一个如下所示的DataFrame:

CategoryNumberConstant
One141.2271.01
One57.4271.01
One51.3271.01
Two24.6927.29
Two12.7227.29
Two10.3727.29

我需要按Category分组,对每组的Constant列进行迭代更新:每组第一个值为初始Constant减去对应Number,后续每个值为前一行更新后的Constant减去当前行的Number,最终得到如下结果:

CategoryNumberConstant
One141.2129.99
One57.472.59
One51.321.29
Two24.692.6
Two12.72-10.12
Two10.37-20.49

请问是否可以不使用for loop实现该需求?


解决方案

完全可以不用for loop实现,利用Pandas的分组和累计求和功能就能高效完成:

核心思路:对于每个分组,更新后的Constant等于分组初始Constant值减去当前行及之前所有Number的累计和。

具体代码实现如下:

import pandas as pd

# 构造示例DataFrame
df = pd.DataFrame({
    'Category': ['One', 'One', 'One', 'Two', 'Two', 'Two'],
    'Number': [141.2, 57.4, 51.3, 24.69, 12.72, 10.37],
    'Constant': [271.01, 271.01, 271.01, 27.29, 27.29, 27.29]
})

# 按Category分组计算并更新Constant列
df['Constant'] = df.groupby('Category').apply(
    lambda x: x['Constant'].iloc[0] - x['Number'].cumsum()
).reset_index(level=0, drop=True)

print(df)

代码说明

  • groupby('Category'):按类别拆分数据,单独处理每组内容
  • x['Constant'].iloc[0]:提取每组的初始Constant值(每组所有行初始值一致,取第一行即可)
  • x['Number'].cumsum():计算每组内Number列的累计求和,等价于逐行累加前面所有Number的值
  • 用初始Constant减去累计和,直接得到迭代更新后的结果,最后通过reset_index去除分组索引,合并回原DataFrame

这种方法依托Pandas的向量化操作,比for loop效率更高,尤其适合处理大规模数据集,运行结果与预期完全一致。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 19:25:19