修改一个Pandas DataFrame时其余关联DataFrame也同步变化的原因及解决办法
问题原因
这是Python中可变对象的引用传递机制导致的:
- Pandas DataFrame属于可变对象,你执行
df1 = dfnan、df2 = dfnan、df3 = dfnan时,没有生成三个独立的DataFrame实例,只是给同一个底层的dfnan对象绑定了三个不同的变量名,三个变量指向内存中完全相同的对象。 - 后续你对
df1、df2的所有修改,本质上都是修改同一个内存地址里的对象,所以三个变量的取值会同步变动,最后全部变成1。
解决方法
如果需要生成独立的DataFrame副本,需要调用.copy()方法显式完成对象复制,只需要修改初始化部分的代码即可:
import numpy as np import pandas as pd # 生成全NaN的基础DataFrame data = np.empty((15, 10)) data[:] = np.nan dfnan = pd.DataFrame(data) # 为每个变量创建独立副本 df1 = dfnan.copy() df2 = dfnan.copy() df3 = dfnan.copy()
修改后再执行你写的循环代码,就可以得到预期结果:df1全为0,df2全为1,df3保持全为NaN。
另外补充优化建议:你写的两个for循环可以直接用Pandas向量化操作代替,运行效率更高,写法也更简洁:
# 替代第一个循环 df1.iloc[:] = 0 # 替代第二个循环 df2.iloc[:] = df1 + 1
内容的提问来源于stack exchange,提问作者Lazer
相关产品推荐
相关产品推荐

