首页 > 解决方案 > 为什么切片熊猫数据帧时会出现速度差异?

问题描述

随着时间的推移,我正在对大量数据帧进行切片。

但是,下面两个代码的运行时间显示出很大差异。

代码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 多分钟。

我认为切片的结果是一样的,但是这种速度差异的原因是什么?

这种速度差异不仅可以通过==条件看到,而且可以通过><条件看到。

也许我错过了什么?

感谢您阅读本文。

标签: pythonpandasdataframe

解决方案


看起来这是因为这条线

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错误,因此必须对所有行评估第二个条件。


推荐阅读