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

Python中for循环无法更新DataFrame值的原因及无循环优化方案

问题解答:DataFrame循环赋值不生效与无循环实现方案

1. 循环赋值不生效的原因与修复

原因

iterrows()返回的row是原DataFrame行数据的副本,不是对原数据的引用。你在循环里修改row['b']只是修改了这个临时副本,并不会同步到bottle原DataFrame中,所以最终bottle的b列仍为NaN。

修复方法

有两种直接的修复方式:

  • 方式一:循环中通过索引直接修改原DataFrame
for index, row in bottle.iterrows():
    total = test[test['a'] == row['a']]['b'].sum()
    bottle.loc[index, 'b'] = total  # 定位到原DataFrame的对应位置赋值
  • 方式二:将修改后的行覆盖原DataFrame的对应行
for index, row in bottle.iterrows():
    row['b'] = test[test['a'] == row['a']]['b'].sum()
    bottle.loc[index] = row  # 把修改后的临时行写回原DataFrame

2. 无循环的高效实现方式

完全不需要用for循环,pandas的groupby + transform是专门解决这类分组聚合后映射回原行的场景,属于矢量化操作,大数据量下性能比循环高几个数量级。

直接一步完成需求,连中间的bottleDataFrame都可以省略:

test['c'] = test.groupby('a')['b'].transform('sum')

执行后test的结果如下,完全匹配你循环计算的预期值:

a  b   c
0  1  5  22
1  1  8  22
2  1  9  22
3  2  1   1
4  3  1   1
5  4  1   1

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 22:15:27