python - 如何使用更快且不发出警告“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
解决方案
通常,您永远不应该使用该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
推荐阅读
- php - 与 Laravel 中的所有视图共享数据?
- typo3 - 在哪里可以找到 TYPO3 扩展?
- java - LibGDX 将文本绘制到左上角
- c# - 表达式是否有默认值,不影响它?
- elasticsearch - 在 k8s 插件文件中部署 ELK 时出现“Kibana 服务器尚未准备好”错误
- fullpage.js - 防止从部分滚动,但允许在 Fullpage.js 中进行定位导航
- vue.js - 在Vue中单击组件时无法切换状态
- python - ValueError:具有多个元素的数组的真值不明确。使用 a.any() 或 a.all() (图像裁剪)
- sql-server - 在 ASP.Net Core 应用程序中动态更改 SQL Server 连接字符串
- mysql - 如何扭转这个过程的结果?