如何简化具有索引比较的嵌套循环?

时间:2019-05-16 15:49:56

标签: python pandas nested-loops simplify

我是个初学者,做了一个基本的嵌套for循环,以修改现有的每小时数据系列。该系列由熊猫制成,具有日期时间索引和值。

我的代码基本上比较两个系列(A和B)的年,月和日索引,如果它们在某些行上相同,则更改series(A)的值并制作一个修改后的系列。

它适用于短数据,但是效率很差。 当我运行10,000个计数数据时,循环永远不会结束。 系列A大约有10,000个计数,系列B大约有1,000个计数。

我已经在简化嵌套循环方面搜索了类似问题几天,但是我无法处理如何处理索引比较部分,而且我希望修改后的A系列的对象类型和索引保持不变。哪怕是一个小技巧也对我很有帮助。

for i in range(0,len(A)):
    for j in range(0,len(B)):
        if A.index.year[i] == B.index.year[j] and A.index.month[i] == B.index.month[j] and A.index.day[i] == B.index.day[j]:
            A.values[i] = B.values[j]
            break
        else:
            pass

1 个答案:

答案 0 :(得分:1)

可以使您受益的一件事是Short Circuiting。基本上,如果您的数据集方便的话,您可以使长条件语句更快地识别错误结果。我不知道您要比较的日期看起来像什么,但请考虑以下示例:

日期1:2019年1月1日

日期2:2019年1月2日

您的条件语句经过3次比较,最终确定两个日期不相等。

  1. 2019 == 2019

  2. 一月==一月

  3. 1!= 2

如果要将条件更改为:

A.index.day[i] == B.index.day[j] and A.index.month[i] == B.index.month[j] and A.index.year[i] == B.index.year[j]

您的程序将首先比较这两天,并确定它们不相等。并且由于您的条件由布尔AND运算组成,因此短路逻辑得出的结论是总体条件必须为假。

通过这种方式,只需要进行一次比较,而不需要进行三次。但是,从这种方法中获得任何显着的改进取决于您的约会日期。如果您的约会都在同一年或同一年,那么我提到的方法肯定可以提高您的表现。但是,如果您的集合包含广泛分布的月,日和年,则可能不会引起明显的变化。

本质上,请考虑平均情况下,您的哪种情况最有可能返回False。在条件语句中首先评估该条件。

希望这会有所帮助!