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

为何修改Pandas DataFrame的c2列后,df.c1的id值发生变化?

Pandas中DataFrame列ID变化的原因解析

嘿,这个问题其实涉及到Pandas里DataFrame和列对象的底层逻辑,咱们一步步拆解来看:

首先先把你的测试代码贴出来,方便对照:

import pandas as pd
df = pd.DataFrame([(1, 2), (3, 4)], columns=['c1', 'c2'])
print("(before df.c2 assignment) id(df.c1):{0} and id(df):{1}".format(id(df.c1), id(df)))
df.c2 = 20
print("(after df.c2 assignment) id(df.c1):{0} and id(df):{1}".format(id(df.c1), id(df)))

现象回顾

运行这段代码后,你会发现df的ID始终保持不变,但df.c1的ID在给df.c2赋值后发生了变化,这看起来有点反直觉对吧?

核心原因拆解

  • DataFrame是可变容器,修改不改变自身ID
    df作为DataFrame实例,属于Python中的可变容器对象。当你给df.c2赋值时,只是修改了这个容器内部的状态(更新了某一列的数据),并没有创建一个全新的DataFrame对象。这和Python列表的行为一致:比如你给列表追加元素,列表的id()也不会发生变化。

  • 列对象(Series)是动态生成的临时实例
    当你访问df.c1时,Pandas并不会在内存中缓存一个固定的Series对象对应这个列。每次访问列属性,Pandas都会动态生成一个新的Series实例(本质是当前DataFrame对应列数据的视图或副本)。这个新生成的实例自然会有一个全新的id()。

    甚至不用修改df,连续两次访问df.c1的id也可能不同——比如你运行print(id(df.c1), id(df.c1)),大概率会得到两个不同的数值。给df.c2赋值只是触发了DataFrame内部状态的更新,但核心逻辑还是:每次访问列都会生成新的Series对象,所以id会变。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 02:28:18