首页 > 解决方案 > 如何使用更快且不发出警告“SettingWithCopyWarning”的熊猫执行以下任务

问题描述

我正在从数据中访问时间戳。如果多个时间戳具有相同的值,则更改它们。在这种情况下,如果两个时间戳相同,则将 2 添加到第二个时间戳。如果三个相同,则第二个加 2,第三个加 4,依此类推。我收到警告 /anaconda/lib/python3.6/site-packages/ipykernel/ main .py:8: SettingWithCopyWarning: A value is trying to be set on a slice of a slice from DataFrame

请参阅文档中的注意事项:http: //pandas.pydata.org/pandas-docs/stable/indexing.html#indexing-view-versus-copy

我的问题是:执行任务需要很长时间。我想知道是否有一些特定的方法可以在 pandas 中以更精确的方式执行任务。请考虑我是熊猫的新手。

dftime =df.time 
for i in range (len(dftime)):
    if i!=0:
        if dftime[i]==dftime[i-1]:
            dftime[i]=dftime[i]+2
        if dftime[i]<dftime[i-1]:
            dftime[i]=dftime[i-1]+2

标签: pythonpandasnumpypandas-groupbypandas-datareader

解决方案


通常,您永远不应该使用该for i in range(len(collection))构造来遍历 Python 中的集合,因为您可以简单地使用for item in collection.

特别是在 pandas 中,你很少需要迭代系列,如果你这样做了,你永远不应该修改你正在迭代的东西。根据数据类型,迭代器可能会返回一个副本并且写入它不会有任何效果。相反,您应该选择对整个数组进行操作。

重写代码的熊猫方式是

dftime = df.time
dftime[dftime == dftime.shift()] += 2
dftime[dftime < dftime.shift()] += 2

推荐阅读