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

为什么pandas.apply(id, axis=1)会为所有行返回相同id?

现象成因

pandas.DataFrame.apply指定axis=1执行逐行处理时,会复用同一个Series对象作为行数据的传递载体,不会为每一行创建全新的独立Series实例。
整个迭代流程中,pandas会预先创建一个Series容器,每处理一行就将该容器的内部数据替换为当前行的取值,再将这个容器传入apply调用的自定义函数。这是pandas为降低频繁创建、销毁对象的性能开销设计的内置逻辑,因此执行df_mock.apply(id, axis=1)时返回的所有id值完全一致,该id对应的就是被反复复用的固定Series容器的内存地址。

复现代码中所有实例的v值均为[7,8,9],正是因为O类初始化时直接执行self.row = row,保存的是复用Series的引用,而非当前行数据的独立副本。当整个apply迭代执行完成后,复用Series中留存的是DataFrame最后一行的数据,后续调用所有O实例的calc()方法时,访问的都是同一个已被更新为最后一行内容的Series,因此拿到的v值全部为最后一行的取值。

修复方案
  • 若需要在实例中保存整行数据,传入对象时主动生成独立副本,避免持有复用对象的引用:
df_mock['obj'] = df_mock.apply(lambda row: O(row.copy()), axis=1)
  • 若仅需要使用行内部分字段,不要保存整个row对象的引用,直接在apply执行阶段提取所需字段存入实例属性,从根源上避免复用对象导致的引用污染。

注意:禁止在axis=1的apply逻辑中持有传入row对象的延迟引用,这类写法在pandas的对象复用机制下必然会出现数据不符合预期的问题。

内容的提问来源于stack exchange,提问作者Iván Sánchez

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 04:33:26