2 回答

TA贡献1712条经验 获得超3个赞
只有当我将df传递给一个函数时,才会发生此问题,通过以下方式切片日期范围:
df.loc[start_date:end_date]
然后尝试创建一个:
df['mdates'] = mdates.date2num(df.index)
我通过在函数内部传递df时复制df解决了这个问题。函数中的第一行代码是:
df = df.copy()
可能不是最有效的方法,但它解决了问题。如果有人能解释为什么在没有这段代码的情况下它会抛出错误,我将不胜感激。

TA贡献2019条经验 获得超9个赞
鉴于您自己答案中的信息,设置与CopyWarning的出现似乎不是因为该功能,而是因为事先的日期切片。mdates.date2num
设置与复制警告的目的是提醒您在执行链接分配时出现潜在的意外行为。在作为链接索引乘积的数据帧上分配值时,将发生链接分配。在这种情况下,发生链式赋值是因为您正在赋值 到 中的列,其中是传递到函数中的原始文件的副本。mdates
df
df
df
意外行为从何而来?执行链接分配时,pandas 可以返回切片或副本。编辑切片时,原始数据帧将受到影响。但是,当您编辑副本时,原始数据帧将不受影响。在执行索引操作之前,很难判断是否将返回切片或副本。
在这种情况下,切片会产生副本。然而,Pandas知道切片是从原始的,并使用弱引用(https://docs.python.org/3/library/weakref.html)来跟踪它。通过弱引用链接到原始内容。pandas 不清楚您是否打算让新列影响原始 df,因此会引发 SetWithCopyWarning。df
df
df
df
当您显式创建数据帧的副本时,pandas 知道您希望它们被单独处理,因此复制的数据帧上的任何值分配都不应影响原始数据帧。因此,不会引发设置与CopyWarning。
资料来源:https://tnwei.github.io/posts/setting-with-copy-warning-pandas/
添加回答
举报