处理同一DataFrame时是否需使用copy方法?两段代码是否等价?
DataFrame处理中copy方法的使用与代码等价性分析
一、处理DataFrame时是否需要用copy方法?
- Pandas对DataFrame做列选择、切片这类操作时,默认返回的是原数据的视图,而非独立的新对象。如果后续要对这个结果做修改操作,很可能触发
SettingWithCopyWarning,甚至不小心改动原DataFrame的数据。 - 如果你需要操作的是和原数据完全独立的新数据集,避免后续操作影响原数据,就必须用
.copy()生成深拷贝;如果只是读取数据、不需要修改,或者明确接受视图和原数据的关联,也可以不用。
二、两段代码的等价性分析
先看两段代码:
第一段代码:
df_av = df_av[['plan_name', 'ADO_ver', 'ADO_incr']].copy() df_av = df_av.dropna(how='all').copy()
第二段代码:
df_av = df_av[['plan_name', 'ADO_ver', 'ADO_incr']] df_av = df_av.dropna(how='all')
结论:两段代码的最终结果完全等价,但中间过程有差异
- 最终结果一致:
dropna(how='all')本身会返回一个新的DataFrame对象(不是视图),不管前面的切片是视图还是拷贝,最后df_av都会被赋值为这个新对象,所以最终存储的数据内容完全相同。 - 中间过程差异:
- 第一段的第一个
.copy()生成了切片的独立拷贝,和原df_av没有关联; - 第二段的切片是原数据的视图,但因为后续直接把
df_av覆盖为dropna的结果,这个视图没有被后续修改,所以不会影响最终结果。
- 第一段的第一个
内容的提问来源于stack exchange,提问作者fransua
相关产品推荐
相关产品推荐

