Pandas dataframe, если условие not на основе предыдущих строк не работает - python


0

Есть ли способ сделать приведенный ниже код более эффективным.

for i in range(0, len(df)):
    current_row = df.iloc[i]    
    if i > 0:
        previous_row =df.iloc[i-1]
    else:
        previous_row = current_row 
    if (current_row[A] != 1):
        if ((current_row[C] < 55) and (current_row[D] >= -1)):
            df.loc[i,F] = previous_row[F] + 1
        else: 
            df.loc[i,F] = previous_row[F]

Например, если кадр данных подобен приведенному ниже:

df = pd.DataFrame({A:[1,1,1, 0, 0, 0, 1, 0, 0], C:[1,1,1, 0, 0, 0, 1, 1, 1], D:[1,1,1, 0, 0, 0, 1, 1, 1],
F:[1,1,1, 0, 0, 0, 1, 1, 1]})

Мой вывод должен выглядеть следующим образом

>>> df
   A  C  D  F
0  1  1  1  1
1  1  1  1  1
2  1  1  1  1
3  0  0  0  2
4  0  0  0  3
5  0  0  0  4
6  1  1  1  1
7  0  1  1  2
8  0  1  1  3

Таким образом, в основном, если условия выполняются, я хочу, чтобы значение F было изменено как предыдущая строка F +1.

Я также попробовал приведенный ниже код, но он не работает.

df[prev] = df.F.shift()
def shift(row):
    row[F] = np.where((row[A] != 1) & ((row[C]<55) & (row[D]>=-1)), row[prev] + 1, row[prev])
    return row[F]

df[F] = df.apply(shift, axis=1)
  •  97
  •  1
  • 11 май 2020 2020-05-11 10:17:52

1 ответ

0

Создайте новый столбец F_previous, используя df.F.shift(1), чтобы вы получили значения со сдвигом 1 как новый столбец. Теперь напишите функцию, используя этот столбец и другие столбцы, чтобы вернуть новое значение F, и используйте метод apply, чтобы получить новые значения для столбца F.

  • 11 май 2020 2020-05-11 10:17:53