Pandas dataframe, если условие not на основе предыдущих строк не работает - PullRequest
0 голосов
/ 17 октября 2019

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

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)

1 Ответ

0 голосов
/ 17 октября 2019

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

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