【问题标题】:How to simplify the nested-loops having index comparison?如何简化具有索引比较的嵌套循环?
【发布时间】:2019-05-17 00:05:52
【问题描述】:

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

我的代码基本上比较了两个系列(A和B)的年月日索引,如果它们在某些行相同,则更改系列(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

【问题讨论】:

  • 这是你想要做的:C = A.reindex(B.index).dropna(axis=0); A.update(B.reindex(C.index)) 注意:就地更新工作
  • 谢谢你,拉明!你能解释一下你的想法吗?
  • 这个想法是获取 A 的行,其索引值也在 B 中,然后用 B 的行在索引中具有这些值的行更新 A

标签: python pandas nested-loops simplify


【解决方案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。在您的条件语句中首先评估该条件。

希望这会有所帮助!

【讨论】:

  • 非常感谢您的明智建议!我完全没有考虑条件的顺序。我的数据包括2-3年的时间,您的建议有帮助!我用你的想法做了一些测试,对于 1000 长度的数据,它及时提高了 50%!但正如你所说,当数据长度增加时,效果会变小到 30% 左右。我希望会有更多的方法来完成这项工作。再次感谢您!
猜你喜欢
  • 1970-01-01
  • 2015-01-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多