考虑以下代码:
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副本的方式有关吗?好像他们被捆绑在一起。
答案 0 :(得分:1)
使用 -
df_new = df.copy()
OR
df_new = df.copy(deep=True)
这是制作pandas
对象索引和数据副本的标准方法。
当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