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
相关产品推荐
相关产品推荐

