Условное замещение на основе предыдущего значения в том же столбце Python Dataframe

Чувствую, что я искал почти везде, и я знаю, что это, вероятно, что-то очень простое. Я работаю с фреймом данных Pandas и собираюсь заполнить / заменить данные в одном из столбцов на основе данных из этого ЖЕ столбца. Я, как правило, более опытный пользователь, и это так просто в Excel. Если у нас есть:

df = pd.DataFrame([0, -1, -1, -1, 0 , 0, 0, 1, 0])
df.columns = ['A']
df['B'] = df['A']

в Excel то, что я пытаюсь сделать, было бы " =IF(И (А2=0, В1=-1), -1, А2), чтобы я мог затем перетащить вниз столбец" В ", и это применимо. По сути На основе предыдущей точки данных столбца B и текущего значения столбца A мне нужно обновить текущее значение B.

Я пробовал:

df['B'] = np.where((df['A'] == 0), (df['B'].shift(1) == -1),
                   df['B'].replace(to_value = 0, method = 'ffill'), df['A'])

и много других версий этого, а также вариаций iterrows и других невероятно экстремальных обходных путей безрезультатно.

Любые предложения с благодарностью.

РЕДАКТИРОВАТЬ:

результат будет:

df['B'] = [0, -1, -1, -1, -1 , -1, -1, 1, 0]

2 ответа

Решение

Вот своего рода метод грубой силы. Возможно, есть что-то более изящное, но вы можете явно зациклить строки следующим образом:

df = pd.DataFrame([0, -1, -1, -1, 0 , 0, 0, 1, 0])
df.columns = ['A']
df['B'] = df['A']

# loop here
for i in range(1,len(df)):
     if df.A[i] == 0 and df.B[i-1] == -1:
             df.B[i] = -1
     else:
             df.B[i] = df.A[i]

Это дает вам результат, который вы ищете:

>>> df['B']
0    0
1   -1
2   -1
3   -1
4   -1
5   -1
6   -1
7    1
8    0

Используя Где

df['B'] = df.A[0:len(df.A)-1].where((df.A==0 ) & (df.B.shift(-1)==-1),-1)
df['B'] = df['B'].fillna(df.A)
Другие вопросы по тегам