Записать значение в ячейку по двум условиям
Всем привет, имею:
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 шт):
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 у вас строка, к элементам столбцов внутри которой вы обращаетесь.