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

