【问题标题】:Strange behavior with DataFrame copy [duplicate]DataFrame复制的奇怪行为[重复]
【发布时间】: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 副本的方式有关吗?好像他们被锁在一起了。

【问题讨论】:

标签: python pandas dataframe


【解决方案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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-05-23
    • 2013-06-28
    • 2015-07-26
    • 2020-04-26
    • 2015-08-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多