РЕДАКТИРОВАННЫЙ ответ по новым данным сначала заполняет значения None
, а затем заменяет Downward
на None
s:
#first replace strings Nones to None type
df['Direction:'] = df['Direction:'].mask(df['Direction:'] == 'None', None)
df['Momentum:'] = df['Direction:'].bfill().mask(lambda x: x == 'Downward', None)
Или:
s = df['Direction:'].bfill()
df['Momentum:'] = s.mask(s == 'Downward', None)
print (df)
Direction: Momentum:
2/01/19 None Upward
1/31/19 Upward Upward
1/30/19 None None
1/29/19 None None
1/28/19 Downward None
1/27/19 None Upward
1/26/19 None Upward
1/25/19 Upward Upward
Старый ответ:
Использование numpy.where
с логической цепочкой для сравнения смещенных значений, а также оригинала на |
для побитового ИЛИ:
mask = df['Direction:'].eq('Upward') | df['Direction:'].shift(-1).eq('Upward')
df['Momentum:'] = np.where(mask, 'Upward', None)
print (df)
Direction: Momentum:
1/31/19 None Upward
1/30/19 Upward Upward
1/29/19 None None
1/28/19 None None
1/27/19 Downward None
1/26/19 None Upward
1/25/19 Upward Upward