python - 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 副本的方式有关吗?好像他们被锁在了一起。
解决方案
利用 -
df_new = df.copy()
或者
df_new = df.copy(deep=True)
这是复制pandas
对象索引和数据的标准方法。
当 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
推荐阅读
- mysql - 如何将 mysql 数据库连接到客户端机器中的多人电脑?
- gatsby - 静态页面路由和仅客户端路由之间的Gatsby或 @reach-router ?
- sql - SQL 查询中每个标题只显示一行
- file - Serilog Net Core 3.1 不创建任何日志文件
- angular - 角度组件路由到主页
- google-app-engine - 如何对从 Google Cloud Storage 存储桶下载的用户实施速率限制?
- c++ - 如何使用 wincrypt.h 在 c++ 中检查 x509 证书的吊销状态?
- python - Python中的斑点检测?
- powershell - 如何使用 powershell 对多个模式进行 grep
- javascript - React-redux,reducer 无法更新状态,代码错误