Упростить вложенные l oop python - PullRequest
0 голосов
/ 17 апреля 2020

У меня есть два больших списка, называемых a и b. Оба они имеют размер 2000 значений. Каждое значение - это DataFrame с 35136 значениями.

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

Спасибо.

1 Ответ

0 голосов
/ 17 апреля 2020

Если я понимаю ваш пример, я думаю, что это должно быть эквивалентно (и значительно быстрее):

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)

Это зависит от того, все ли кадры данных имеют одинаковый индекс (а не только одинаковый размер), что будет использоваться по умолчанию, если вы не установили свои собственные индексы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...