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

