Записать значение в ячейку по двум условиям

Всем привет, имею:

import pandas as pd    
df = pd.DataFrame({'column1': ['name1', 'name2', 'name3'], 'column2': [100, 200, 300], 'column3': ['', 200,''], 'column4': [100,'','']}) 
df

на выходе

  column1  column2 column3 column4
0   name1      100             100
1   name2      200     200        
2   name3      300       

Задача

В новую колонку "Итог":

  • если вторая колонка равна четвертой, то вывести значение - "Условие_1",
  • если вторая колонка равна третьей, то вывести значение из первой колонки,
  • если условия не соблюдены -- оставить пустоту.

Итог должен быть таким:

  column1  column2 column3 column4              Итог
0   name1      100             100              Условие_1   
1   name2      200     200                      name2
2   name3      300                  

мое решение:

df['Итог'] = df.apply(lambda x: 'Условие_1' if x['column2'] == x['column4'] else (df['column1'] if x['column2'] == x['column3'] else ''), axis=1)

дает странный результат

  column1  column2 column3 column4                   Итог
0   name1      100             100                       
1   name2      200     200                      Условие_1
2   name3      300                  [name1, name2, name3]

Собственно вопрос: почему значение вписывается в строчку где совпадения нет, а так же берет все значения из всей колонки, а не только одно?

Я уже решил это через select numpy, но очень хочется получить ответ, как это сделать через apply.

И, по возможности, дайте развернутый ответ - очень хочется понять как работает, а не просто скопировать готовый код. Заранее спасибо!


Ответы (1 шт):

Автор решения: CrazyElf
else (df['column1'] if 
      ^^ - тут должен быть x

У вас в одном месте вместо x написано df, а в остальном всё правильно работает. Я исправил только это место:

df['Итог'] = df.apply(lambda x: 'Условие_1' if x['column2'] == x['column4'] else (x['column1'] if x['column2'] == x['column3'] else ''), axis=1)

Вывод:

  column1   column2 column3 column4 Итог
0   name1   100             100     Условие_1
1   name2   200     200             name2
2   name3   300         

А объяснять тут вроде особо нечего, просто в lambda применён два раза тернарный оператор x if condition else y (второй раз - внутри else). А lambda тут оперирует строками, в x у вас строка, к элементам столбцов внутри которой вы обращаетесь.

→ Ссылка