python - 为什么切片熊猫数据帧时会出现速度差异?
问题描述
随着时间的推移,我正在对大量数据帧进行切片。
但是,下面两个代码的运行时间显示出很大差异。
代码1。
for i in city_list:
from_line = df[(df['Timestamp']==time_from)
& (df['city']==i)]
to_line = df[(df['Timestamp']==time_to)
& (df['city']==i)]
value1 = len(from_line['Value'])
value2 = len(to_line['Value'])
...
...
代码2。
for i in city_list:
from_line_sub = df[df['Timestamp']==time_from]
from_line = from_line_sub[from_line_sub['city']==i]
to_line_sub = df[df['Timestamp']==time_to)]
to_line = to_line_sub[to_line_sub['city']==i]
value1 = len(from_line['Value'])
value2 = len(to_line['Value'])
...
...
Code1 需要一个多小时,而 code2 只需要 20 多分钟。
我认为切片的结果是一样的,但是这种速度差异的原因是什么?
这种速度差异不仅可以通过==
条件看到,而且可以通过>
和<
条件看到。
也许我错过了什么?
感谢您阅读本文。
解决方案
看起来这是因为这条线
from_line = df[(df['Timestamp']==time_from) & (df['city']==i)]
&
不会像您期望的那样对操作员造成短路。这意味着它正在评估每一行的两个条件df
以返回两个条件都为 的行True
。
在第二个例子中,这条线
from_line_sub = df[df['Timestamp']==time_from]
正在返回原始数据帧的较小子集(考虑到执行时间差异,可能要小得多),则第二个条件仅适用于下一行中的该结果子集。
这是一个示例,显示短路无法按预期工作。
import pandas as pd
df = pd.DataFrame({'A': pd.Series([1, 2, 3], dtype=object),
'B': pd.Series([4, 5, 0], dtype=object)})
a1 = df[(df['A'] == 1) & (1 / df['B'] == 0.25)]
print(a1)
如果&
操作员使第二个条件短路,您会期望1 / df['B']
仅针对第一行(其中df['A'] == 1
)进行评估,并且只会打印该行。但是,此代码会引发ZeroDivisionError: division by zero
错误,因此必须对所有行评估第二个条件。
推荐阅读
- sql - 尝试插入表 A 并链接表 B 和 C,但如果不存在则添加到所有表
- swift - 收到警告消息
在 getter setter 方法中 - java - Java HTMLUnit WebClient ScriptException 错误
- angular - 如何在静态类中注入服务而不在 Angular 7 的子类中传递服务?
- regex - 环回 3 字符串与和条件不匹配
- android - 如何使用带有 Kotlin 的房间 ORM 将现有数据库与 Android 应用程序一起使用
- amazon-web-services - 具有 API Gateway 和 lambda 函数的 AWS Webapi 已发布,但未在 AWS 控制台中显示
- javascript - Eslint precommit husky hook 在 create-react-app 项目中没有按预期工作
- typescript - 有没有办法在打字稿中为具有唯一项目的数组定义类型?
- sql-server - 在 SQL Server 2008 中,管理工作室未打开