DataFrame副本的奇怪行为

时间:2018-05-16 10:25:00

标签: python pandas 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的 Age 列(< em> df )也改变了。

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

1 个答案:

答案 0 :(得分:1)

使用 -

df_new = df.copy()

OR

df_new = df.copy(deep=True)

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

来自pandas documentation

  

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

<强>解释

如果您看到自己创建的各种数据框的对象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