首页 > 解决方案 > DataFrame 复制的奇怪行为

问题描述

考虑这段代码:

In [16]: data = [['Alex',10],['Bob',12],['Clarke',13]]
In [17]: df = pd.DataFrame(data,columns=['Name','Age'])
Out[18]: 
     Name  Age
0    Alex   10
1     Bob   12
2  Clarke   13

In [19]: df_new = df
In [20]: df_new['Age'] = df_new['Age'] * 90 / 100

In [21]: df_new
     Name   Age
0    Alex   9.0
1     Bob  10.8
2  Clarke  11.7

In [22]: df
     Name   Age
0    Alex   9.0
1     Bob  10.8
2  Clarke  11.7

当我为新 DataFrame ( df_new ) 的Age列分配新值时,原始 DataFrame ( df ) 的Age列也发生了变化。

为什么会这样?它与我创建原始 DataFrame 副本的方式有关吗?好像他们被锁在了一起。

标签: pythonpandasdataframe

解决方案


利用 -

df_new = df.copy()

或者

df_new = df.copy(deep=True)

这是复制pandas对象索引和数据的标准方法。

来自pandas documentation

当 deep=True(默认)时,将使用调用对象的数据和索引的副本创建一个新对象。对副本的数据或索引的修改不会反映在原始对象中

解释

如果您看到您创建的各种 DataFrame 的对象 ID,您可以清楚地看到发生了什么。

当您编写 df_new = df 时,您正在创建一个名为 的变量new_df,并将其与具有相同 id 的对象绑定df

例子

data = [['Alex',10],['Bob',12],['Clarke',13]]
df = pd.DataFrame(data,columns=['Name','Age'])

df_new = df
df_copy = df.copy()
print("ID of old df: {}".format(id(df)))
print("ID of new df: {}".format(id(df_new)))
print("ID of copy df: {}".format(id(df_copy)))

输出

ID of old df: 113414664
ID of new df: 113414664
ID of copy df: 113414832

推荐阅读