pandas中通过列表引用修改DataFrame未生效是什么原因?
核心原因
Python中列表存储的是对象的内存引用,不是对象本身,你遇到的问题本质是混淆了「替换列表内的引用」和「修改引用指向的原对象」两个完全不同的操作:
- 执行
dfList = [df1, df2, df3]时,列表第0位存放的引用,和全局变量df1指向内存中同一个DataFrame实例 - 执行
dfList[0] = pd.DataFrame("bigChange")时,操作逻辑是:新创建一个值为"bigChange"的DataFrame对象,然后把列表第0位原来存的、指向df1的引用,替换成指向这个新DataFrame的引用。整个过程没有对原来的df1实例做任何修改,全局变量df1的指向也没有发生任何变化,自然访问原df1看不到任何变更。
打个直白的比方:你把三个朋友的联系方式存在通讯录的前三个位置,你把通讯录第一个位置的号码改成了外卖店的电话,不代表你第一个朋友的号码就变成外卖电话了,只是你通讯录里存的内容改了而已。
另外注意你代码里有个笔误:pandas的DataFrame类名首字母大写,正确写法是pd.DataFrame,写pd.dataFrame会直接触发属性报错。
两种操作的差异对比
你可以通过下面两个示例明确感知操作的区别:
1. 替换列表引用(不会修改原对象)
import pandas as pd df1 = pd.DataFrame({'a':[1,2,3]}) df2 = pd.DataFrame() df3 = pd.DataFrame() dfList = [df1, df2, df3] dfList[0] = pd.DataFrame({"bigChange":[1]}) # 此时df1还是原来的三行a列数据,只有dfList[0]是新生成的DataFrame print(df1)
2. 原地修改原对象(所有指向该对象的变量都能看到变更)
import pandas as pd df1 = pd.DataFrame({'a':[1,2,3]}) df2 = pd.DataFrame() df3 = pd.DataFrame() dfList = [df1, df2, df3] # 访问到原对象后做原地修改 dfList[0].loc[:, 'a'] = 'bigChange' # 此时不管是访问dfList[0]还是df1,a列的值都变成了bigChange print(df1)
快速判断规则:只要你写的是
list[idx] = xxx这种等号左边直接是列表下标的写法,都是在修改列表自身的存储内容,和原位置指向的对象没有关系;如果等号左边是list[idx].属性/下标,才是在修改原对象的内容。
内容的提问来源于stack exchange,提问作者Revezd
相关产品推荐
相关产品推荐

