【问题标题】:Simplify nested loop python简化嵌套循环python
【发布时间】:2020-04-17 07:30:17
【问题描述】:

我有两个名为 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

谢谢。

【问题讨论】:

  • 请提供输入数据的最小示例,以便我们轻松运行和测试代码。

标签: python pandas performance


【解决方案1】:

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

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,除非您设置了自己的索引,否则这将是默认设置。

【讨论】:

    猜你喜欢
    • 2012-06-23
    • 2015-01-15
    • 1970-01-01
    • 2022-01-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-19
    • 2019-12-28
    相关资源
    最近更新 更多