Как заполнить прямое значение при указании одного условия для другого столбца?

Я анализирую одну таблицу, как показано ниже. В столбце 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

Привет. Можете ли вы предоставить MRE? stackoverflow.com/help/минимально-воспроизводимый-пример . Вы получите помощь быстрее, если люди смогут копировать и вставлять что-то вроде df = pd.DataFrame({'event': ['offer_received', ..., чтобы они могли работать над вашей проблемой без необходимости вручную вводить ваши данные. Ваше здоровье!

Mike 27.05.2019 16:05

Конечно! Я добавил это в вопрос. :)

user10396157 28.05.2019 13:36
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
2
112
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Я думаю, вы можете добраться туда с помощью 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... У вас есть альтернатива?

user10396157 28.05.2019 13:22

Эй, Майк! Извините за предыдущий комментарий, это действительно работает! Большое спасибо!!!

user10396157 28.05.2019 14:03

Другие вопросы по теме