为了账号安全,请及时绑定邮箱和手机立即绑定

设置与复制警告索引

设置与复制警告索引

慕哥6287543 2022-08-02 16:16:24
当我尝试从索引(包含datetime64[ns])创建一列mdate时,通过以下方式:df['mdates'] = mdates.date2num(df.index)我得到:设置与CopyWarning我该如何解决这个问题。通常我会使用df.loc,但你怎么能在索引上使用df.loc呢?
查看完整描述

2 回答

?
交互式爱情

TA贡献1712条经验 获得超3个赞

只有当我将df传递给一个函数时,才会发生此问题,通过以下方式切片日期范围:

df.loc[start_date:end_date]

然后尝试创建一个:

df['mdates'] = mdates.date2num(df.index)

我通过在函数内部传递df时复制df解决了这个问题。函数中的第一行代码是:

df = df.copy()

可能不是最有效的方法,但它解决了问题。如果有人能解释为什么在没有这段代码的情况下它会抛出错误,我将不胜感激。


查看完整回答
反对 回复 2022-08-02
?
慕少森

TA贡献2019条经验 获得超9个赞

鉴于您自己答案中的信息,设置与CopyWarning的出现似乎不是因为该功能,而是因为事先的日期切片。mdates.date2num

设置与复制警告的目的是提醒您在执行链接分配时出现潜在的意外行为。在作为链接索引乘积的数据帧上分配值时,将发生链接分配。在这种情况下,发生链式赋值是因为您正在赋值 到 中的列,其中是传递到函数中的原始文件的副本。mdatesdfdfdf

意外行为从何而来?执行链接分配时,pandas 可以返回切片副本。编辑切片时,原始数据帧将受到影响。但是,当您编辑副本时,原始数据帧将不受影响。在执行索引操作之前,很难判断是否将返回切片或副本。

在这种情况下,切片会产生副本。然而,Pandas知道切片是从原始的,并使用弱引用(https://docs.python.org/3/library/weakref.html)来跟踪它。通过弱引用链接到原始内容。pandas 不清楚您是否打算让新列影响原始 df,因此会引发 SetWithCopyWarning。dfdfdfdf

当您显式创建数据帧的副本时,pandas 知道您希望它们被单独处理,因此复制的数据帧上的任何值分配都不应影响原始数据帧。因此,不会引发设置与CopyWarning。

资料来源:https://tnwei.github.io/posts/setting-with-copy-warning-pandas/


查看完整回答
反对 回复 2022-08-02
  • 2 回答
  • 0 关注
  • 111 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号