DataFrame复制的奇怪行为[重复]

Posted

技术标签:

【中文标题】DataFrame复制的奇怪行为[重复]【英文标题】:Strange behavior with DataFrame copy [duplicate] 【发布时间】:2018-10-26 08:39:36 【问题描述】:

考虑这段代码:

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 (Age) 的 Age 列em>df) 也发生了变化。

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

【问题讨论】:

pandas.pydata.org/pandas-docs/stable/generated/… 需要df_new = df.copy(),同时查看this ***.com/questions/17246693/… 【参考方案1】:

使用 -

df_new = df.copy()

df_new = df.copy(deep=True)

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

来自pandas documentation

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

说明

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

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

示例

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

【讨论】:

以上是关于DataFrame复制的奇怪行为[重复]的主要内容,如果未能解决你的问题,请参考以下文章

Coffeescript奇怪的行为[重复]

默认复制/移动构造函数时 GDB 中的奇怪行为

C# ref 奇怪的行为[重复]

Python数组奇怪的行为? [复制]

split String方法的奇怪行为[重复]

UNION 语句相同的选定值 - 奇怪的行为 [重复]