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

为何Pandas中df1指定行列值无法被df2覆盖?

问题:DataFrame赋值未生效的原因及解决办法

问题场景

现有两个索引不同的DataFrame:

df1
    'A'  'B'   'C'
23   0   cat   orange
24   0   cat   orange
25   0   cat   orange

df2
    'A'  'B'   'C'
56   2   dog   yellow
64   4   rat   orange
85   2   bat   red

需要用df2第64行的A、B列值覆盖df1第25行的对应列,但执行以下代码后,df1并未被修改:

df1[['A','B']].loc[25] = df2[['A','B']].loc[64]

原因解析

这是链式索引导致的副本赋值问题:

  • df1[['A','B']] 这种列选取操作返回的是原DataFrame的副本而非视图(Pandas在该场景下无法保证返回视图,默认生成副本)。
  • 后续的.loc[25]是对这个临时副本进行操作,赋值只会修改这个副本,不会影响原始的df1。语句执行完毕后副本会被销毁,所以原df1完全没有变化。

正确的赋值方式

要直接修改原DataFrame的指定行和列,需要将行与列的选择合并到一次loc调用中,确保操作的是原DataFrame的视图:

df1.loc[25, ['A','B']] = df2.loc[64, ['A','B']]

执行后即可成功用df2第64行的A、B列值覆盖df1第25行的对应列。

(注:你给出的期望结果中第25行B列是bat,这对应df2第85行的B列值,若需要取该行数据,代码应改为df1.loc[25, ['A','B']] = df2.loc[85, ['A','B']])

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 09:55:27