首页 > 解决方案 > 简化嵌套循环python

问题描述

我有两个名为 a 和 b 的大列表。它们的大小均为 2000 个值。每个值都是具有 35136 个值的 DataFrame。

a = [Dataframe, Dataframe....] --> Size:2000
a[0] = [0, 0, 0, 2, 0, 0, 3, 0....] -->Name: colA, Size:35136
.
.
a[8] = []
.
.
b = [Dataframe, Dataframe....]
b[0] = [11, 0, 0, 0, 50, 0, 0, 11.....] -->Name: colB, Size:35136

我需要更改 DataFrame 在两个列表和每个 DataFrame 中进行迭代。如何更快地做到这一点?

for j in range(0, 2000):
    for i in range(0, 35136):
        if len(a[j]) == 0:
           b[j] = []
        else:
           if b[j]['colA'][i] != 0:
               tmp = b[j]['colA'][i]
           if (b[j]['colA'][i] == 0) & (a[j]['colB'][i] == 0):
              b[j]['colA'][i] = tmp

所需的输出用于此输入:

b[0] = [11, 11, 11, 0, 50, 50, 0, 11.....] -->Name: colB, Size:35136

谢谢你。

标签: pythonpandasperformance

解决方案


如果我理解您的示例,我认为这应该是等效的(并且速度要快得多):

for idx, (df_a, df_b) in enumerate(zip(a, b)):
    if len(df_a) == 0:
       b[idx] = []
    else:
       df_b['colA'].mask(cond=(df_b['colA'] == 0) & (df_a['colB'] == 0), 
                         other=df_b['colA'].where(df_b['colA'] != 0).ffill(),
                         inplace=True)

这依赖于所有具有相同索引(不仅仅是相同大小)的 DataFrame,除非您设置了自己的索引,否则这将是默认设置。


推荐阅读