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

2024-04-26 05:27:13 发布

您现在位置:Python中文网/ 问答频道 /正文

我是个乞丐,做了一个基本的嵌套for循环来修改现有的一系列(a)小时数据。这个系列由熊猫组成,有日期时间索引和值。你知道吗

我的代码基本上比较了两个序列(A&B)的年、月和日索引,如果它们在某些行中相同,则更改序列(A)的值并生成一个修改的序列。你知道吗

它适用于短数据,但效率很低。 当我运行10000个计数数据时,循环永远不会结束。 A系列约为10000支,B系列约为1000支。你知道吗

我已经搜索了好几天关于简化嵌套循环的类似问题,但是我无法处理如何处理索引比较部分,另外我希望在修改后序列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

Tags: and数据inforindexlen时间range
1条回答
网友
1楼 · 发布于 2024-04-26 05:27:13

有一件事可能会让你受益,那就是Short Circuiting。基本上,如果数据集方便的话,可以让长条件语句更快地识别错误结果。我不知道你比较的日期具体是什么样的,但考虑一下这个例子:

日期: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]

你的程序将首先比较这两天,并确定它们不相等。因为你的条件是由布尔运算和运算组成的,所以短路逻辑的结论是,整个条件一定是假的。你知道吗

这样,只需要做一次比较,而不是三次。然而,这种方法的任何显著改进都取决于你的约会是什么样的。如果你的约会都在同一年,或者是同几年,我提到的方法肯定能提高你的表现。但是如果你的集合包含了月、日、年的广泛分布,你可能不会得到那么明显的变化。你知道吗

基本上,考虑在一般情况下哪个条件最有可能返回False。在条件语句中首先计算该条件。你知道吗

希望这有帮助!你知道吗

相关问题 更多 >