Я анализирую одну таблицу, как показано ниже. В столбце offer_id
есть несколько значений None, когда в столбце событий отображается transaction
. Я хотел бы заполнить None значением вперед, только если предыдущее событие равно offer viewed
, в противном случае заполните значение None равным 0 или просто оставьте его равным none.
Фрейм данных:
df = pd.DataFrame({'event': ['offer_received', 'offer_viewed','transaction', 'transaction', 'offer_received', 'transaction'], 'user':['A','A','A','A','A','A'], 'value':[0, 0, 1.09, 2.55, 0, 3.02], 'offer_id': ['0b1e1539f2cc45b7b9fa7c272da2e1d7', '0b1e1539f2cc45b7b9fa7c272da2e1d7', 'None', 'None', '3f207df678b143eea3cee63160fa8bed', 'None'], 'days':[0, 0.25, 9.75, 11, 0,9.75]})
event user value offer_id days
offer received A 0.00 0b1e1539f2cc45b7b9fa7c272da2e1d7 0.00
offer viewed A 0.00 0b1e1539f2cc45b7b9fa7c272da2e1d7 0.25
transaction A 1.09 None 9.75
transaction A 2.55 None 11
offer received A 0.00 3f207df678b143eea3cee63160fa8bed 0.00
transaction A 3,02 None 9.75
Я пытался использовать df.offer_id.fillna(method = 'ffill')
, но я просто не знаю, как я могу поместить условие в столбец событий, когда предыдущим событием является offer_viewed
, а затем заполнить offer_id
из transaction
, используя (method = 'ffill')
.
Мой ожидаемый результат будет таким:
event user value offer_id days
offer received A 0.00 0b1e1539f2cc45b7b9fa7c272da2e1d7 0.00
offer viewed A 0.00 0b1e1539f2cc45b7b9fa7c272da2e1d7 0.2
transaction A 1.09 0b1e1539f2cc45b7b9fa7c272da2e1d7 9.75
transaction A 2.55 0b1e1539f2cc45b7b9fa7c272da2e1d7 11
offer received A 0.00 3f207df678b143eea3cee63160fa8bed 0.00
transaction A 3,02 None 9.75
Конечно! Я добавил это в вопрос. :)
Я думаю, вы можете добраться туда с помощью shift()
, ffill()
и where()
:
df = pd.DataFrame({'e': ['r', 'v', 't', 'r', 't'], 'oid': [1, 1, np.nan, 2, np.nan]})
df
# e oid
# 0 r 1.0
# 1 v 1.0
# 2 t NaN
# 3 r 2.0
# 4 t NaN
df.oid = df.oid.ffill().where(df.e.shift() == 'v', df.oid)
df
# e oid
# 0 r 1.0
# 1 v 1.0
# 2 t 1.0
# 3 r 2.0
# 4 t NaN
Вы даже можете пропустить ffill()
и использовать shift()
дважды:
df = pd.DataFrame({'e': ['r', 'v', 't', 'r', 't'], 'oid': [1, 1, np.nan, 2, np.nan]})
df.oid = df.oid.shift().where(df.e.shift() == 'v', df.oid)
df
# e oid
# 0 r 1.0
# 1 v 1.0
# 2 t 1.0
# 3 r 2.0
# 4 t NaN
Эй, Майк! Большое спасибо за ваш ответ. Я пробовал оба. Но не знаю почему, не работает. столбцы offer_id, связанные с "транзакцией", по-прежнему отображаются как None... У вас есть альтернатива?
Эй, Майк! Извините за предыдущий комментарий, это действительно работает! Большое спасибо!!!
Привет. Можете ли вы предоставить MRE? stackoverflow.com/help/минимально-воспроизводимый-пример . Вы получите помощь быстрее, если люди смогут копировать и вставлять что-то вроде
df = pd.DataFrame({'event': ['offer_received', ...
, чтобы они могли работать над вашей проблемой без необходимости вручную вводить ваши данные. Ваше здоровье!