Python тернарный оператор pandas

Тернарный оператор в Python: использовать или не использовать? — CODEFATHER

В этом руководстве вы узнаете о нем все, чтобы использовать его в своих программах.

Тернарный оператор Python (или условное выражение) работает с тремя операндами и позволяет записать логику оператора if else в одной строке кода. С помощью тернарного оператора вы указываете выражение, оцениваемое, если условие истинно, само условие и выражение, вычисляемое, если условие имеет значение Ложь.

Не волнуйтесь, если это не совсем ясно из определения, мы рассмотрим несколько примеров, которые все прояснят.

Что такое тернарный оператор в Python?

Синтаксис тернарного оператора или условного выражения в Python следующий:

Выражение, вычисляемое тернарным оператором, зависит от логического значения условия.

Примечание: для тех, кто не знаком с логическими значениями, логическая переменная может иметь только два значения: True или False.

Вот пример тернарного оператора…

Допустим, мы хотим вернуть другую строку в зависимости от значения логической переменной с именем success.

Если success — True, мы возвращаем строку «Операция успешна», в противном случае мы возвращаем строку «Операция не удалась».

>>> success = True >>> "Operation successful" if success else "Operation failed" 'Operation successful'

И вот что произойдет, если success имеет значение False:

>>> success = False >>> "Operation successful" if success else "Operation failed" 'Operation failed'

Как видите, условие в тернарном выражении следующее:

Это эквивалентно написанию…

>>> success = True >>> "Operation successful" if success == True else "Operation failed" 'Operation successful' >>> success = False >>> "Operation successful" if success == True else "Operation failed" 'Operation failed'

Почему это называется тернарным оператором?

Если вам интересно, почему это называется тернарным оператором, вот ответ .

Название тернарный оператор происходит от того, что этот оператор работает с тремя операндами. Три операнда:

  • Выражение оценивается, если условие истинно
  • Состояние само
  • Выражение оценивается, если условие ложно.

Это эквивалентно выражению if else, и преимущество состоит в том, что он записывается в одной строке.

Присвоение значения тернарного выражения переменной

В предыдущем разделе мы видели, как использовать тернарный оператор.

Когда вы пишете программу Python, вы используете переменные для хранения определенных значений, которые вы хотите использовать позже в своей программе.

Давайте посмотрим, как мы можем сохранить значение, возвращенное предыдущим тернарным выражением, в переменную.

>>> success = True >>> message = "Operation successful" if success else "Operation failed" >>> print(message) Operation successful

Переменная message теперь содержит значение, возвращаемое тернарным выражением.

Сокращенное троичное выражение Python

Python также предоставляет сокращенную версию тернарного выражения, называемую сокращенным тернарным выражением.

Представьте, что вы создаете систему, которая интегрируется с другой системой, и переменная connection_output сообщает вам, успешно ли установлено соединение между двумя системами.

Успешный сценарий

>>> connection_output = "Connection OK" >>> message = connection_output or "Connection Failed" >>> print(message) Connection OK

Сценарий сбоя

>>> connection_output = None >>> message = connection_output or "Connection Failed" >>> print(message) Connection Failed

Как вы можете видеть в сценарии сбоя, сокращенный тернарный оператор возвращает строку «Connection Failed», поскольку значение переменной connection_output равно None.

Лучше ли тернарный оператор, чем оператор If-Else?

Я хочу сравнить, как можно написать одну и ту же условную логику с использованием тернарного оператора и стандартного оператора if-else.

Вот тернарный оператор, над которым мы будем работать:

message = "Operation successful" if success else "Operation failed"

И вот как вы могли бы написать это с помощью оператора if-else:

if success: message = "Operation successful" else: message = "Operation failed"

Примечание: убедитесь, что вы присвоили переменной success логическое значение, чтобы выполнить приведенный выше код.

Если вы не зададите значение переменной success, вы увидите следующую ошибку:

Traceback (most recent call last): File "", line 1, in NameError: name 'success' is not defined

Я написал учебное пособие, в котором вы узнаете больше о Python NameError, если вам интересно.

Как видите, для стандартного оператора if-else требуется четыре строки кода по сравнению с кодом, написанным с использованием тернарного оператора, для которого требуется только одна строка кода.

Следует ли использовать тернарный оператор? Пример с несколькими условиями

Тернарный оператор позволяет сделать ваш код более лаконичным.

Это помогает записать в одной строке ту же логику, которая потребовала бы нескольких строк при использовании стандартных операторов if else.

При написании простых условных выражений может быть хорошей идеей использовать тернарный оператор, чтобы уменьшить длину вашего кода.

… Если условное выражение становится более сложным, использование тернарного оператора может затруднить чтение вашего кода.

Вот пример с несколькими условиями:

expression1 if condition1 else expression2 if condition2 else expression3

Когда вы читаете общий синтаксис, это уже сбивает с толку, давайте посмотрим на примере, чтобы узнать, станет ли это условное выражение понятнее.

message = "x smaller than 10" if x < 10 else "x greater than 10" if x >10 else "x equal to 10"

Вау . это длинная строка кода!

>>> x = 6 >>> message = "x smaller than 10" if x < 10 else "x greater than 10" if x >10 else "x equal to 10" >>> print(message) x smaller than 10 >>> x = 13 >>> message = "x smaller than 10" if x < 10 else "x greater than 10" if x >10 else "x equal to 10" >>> print(message) x greater than 10 >>> x = 10 >>> message = "x smaller than 10" if x < 10 else "x greater than 10" if x >10 else "x equal to 10" >>> print(message) x equal to 10

Код работает нормально, но тернарное выражение становится все труднее читать.

Вот как выглядит стандартный if else для реализации той же логики:

if x < 10: message = "x smaller than 10" else: if x >10: message = "x greater than 10" else: message = "x equal to 10"

Запустите его в оболочке Python, чтобы проверить этот код, присвоив x разные значения так же, как мы это делали раньше.

Этот код намного проще читать, и мы можем улучшить его с помощью оператора Python elif:

if x < 10: message = "x smaller than 10" elif x >10: message = "x greater than 10" else: message = "x equal to 10"

Сейчас даже лучше, я определенно предпочитаю эту последнюю реализацию начальному тернарному оператору.

Как разработчик ваша цель — найти лучший компромисс между кратким кодом, который в то же время будет читабельным.

И в этом случае использование if-elif-else делает наш код намного чище.

Тернарный оператор Python с использованием кортежей

Также возможно написать тернарный оператор более коротким способом, используя кортеж Python.

Чтобы увидеть, как работает этот синтаксис, давайте начнем с синтаксиса базового тернарного оператора:

Если условие верно

>>> x = 1 >>> y = 2 >>> x if x > 0 else y 1

Если условие «ложно»

>>> x = -1 >>> y = 2 >>> x if x > 0 else y 2

Теперь давайте посмотрим, как написать это выражение с помощью кортежа:

Если условие верно

Если условие «ложно»

Тернарный оператор, использующий кортеж, возвращает тот же результат, что и стандартный тернарный оператор.

Это может немного сбить с толку, когда вы впервые увидите этот тернарный оператор кортежа.

Чтобы понять, как это работает, вам сначала нужно знать, как логические значения True и False представлены в Python как целые числа.

Давайте воспользуемся оболочкой Python и преобразуем True и False в целые числа с помощью встроенного класса int ().

Как показано выше, True соответствует 1, а False — 0.

Мы можем использовать выходные данные условия в качестве индекса для доступа к одному из элементов кортежа

… Если условие возвращает 0 (False), мы обращаемся к первому элементу кортежа, в противном случае — ко второму элементу.

Это также объясняет, почему элементы кортежа в нашем примере поменялись местами:

Является ли тернарный оператор быстрее, чем оператор «если-еще»?

Лучший способ узнать, работает ли тернарный оператор быстрее, чем стандартный оператор if-else, — это сравнить производительность двух подходов.

Используя модуль timeit, мы сравним следующее троичное выражение…

… Следующий оператор if else:

if x > 0: result = x else: result = y

и тернарное выражение ниже, в котором используется кортеж:

Создайте файл Python с именем ternary_operator_performance.py со следующим кодом:

def ternary_operator(x, y): result = x if x > 0 else y return result def if_else_statement(x, y): if x > 0: result = x else: result = y return result def ternary_tuple(x, y): result = (y, x)[x > 0] return result

Затем используйте модуль timeit для измерения времени выполнения трех функций:

Тернарный оператор

$ python -m timeit -s "from ternary_operator_performance import ternary_operator" "ternary_operator(1, 2)" 10000000 loops, best of 3: 0.0503 usec per loop

Стандартное выражение if else

$ python -m timeit -s "from ternary_operator_performance import if_else_statement" "if_else_statement(1, 2)" 10000000 loops, best of 3: 0.051 usec per loop

Тернарное выражение с использованием кортежа

$ python -m timeit -s "from ternary_operator_performance import ternary_tuple" "ternary_tuple(1, 2)"10000000 loops, best of 3: 0.0688 usec per loop

Самый быстрый — это базовый тернарный оператор, за которым следует инструкция if-else, а затем тернарное выражение с кортежем.

Вывод

Надеюсь, вы нашли этот урок полезным.

Теперь вы должны знать почти все, что вам нужно, чтобы использовать тернарный оператор .

… На этом этапе вы можете выбрать: будете ли вы использовать тернарный оператор или стандартный оператор if-else?

Независимо от того, что вы используете, просто убедитесь, что ваш код чист.

Это облегчит вашу жизнь и жизнь тем, кто будет читать ваш код 🙂

Источник

Use ternary operator in apply function in pandas dataframe, without grouping columns

How can I use ternary operator in the lambda function within apply function of pandas dataframe? First of all, this code is from R/plyr, which is exactly what I want to get:

ddply(mtcars, .(cyl), summarise, sum(ifelse(carb==4,1,0))/sum(ifelse(carb %in% c(4,1),1,0))) 

in the above function, I can use ifelse function, R’s ternary operator, to compute the resultant dataframe. However, when I want to do the same in Python/pandas with the following code

mtcars.groupby(["cyl"]).apply(lambda x: sum(1 if x["carb"] == 4 else 0) / sum(1 if x["carb"] in (4, 1) else 0)) 
ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all() 

So how can I compute and get the same dataframe as in R/plyr? For your information, if I use the ternary operator without grouping the columns, such as

mtcars.apply(lambda x: sum(1 if x["carb"] == 4 else 0) / sum(1 if x["carb"] in (4, 1) else 0), axis=1) 

, I can get the resultant dataframe for some reasons (but it’s not what I wanted to do). Thanks. [Update] Sorry, the original example is not a good one when it comes to the use of ternary operator, since it uses 1 and 0 , which can be used as a binary. So the updated R/plyr code is the following:

ddply(mtcars, .(cyl), summarise, sum(ifelse(carb==4,6,3))/sum(ifelse(carb %in% c(4,1),8,4))) 

Источник

In pandas / python, ternary operator to replace NaN in string column with value from different column

enter image description here

None of these 3 attempted solutions are working.

# dd['col3'] = np.where(type(dd['col1']) == float, dd['col2'], dd['col1']) # dd = dd.assign(col3 = lambda x: x.col2 if type(x.col1) == float else x.col1) # dd = dd.assign(col3 = lambda x: x.col2 if np.isnan(x.col1) else x.col1) 

enter image description here

Our goal is to have col3 have the values Team1 and Team3 . Even better to simply re-assign col1 to these values. I understand why the 3rd attempt is not working, as we cannot call np.isnan() on string values. Not sure why the other 2 approaches are not working (I checked and NaN is float type), or what we could do here.

1 Answer 1

d = dd = pd.DataFrame(data=d) def check_missing_values(value): if value is np.nan: return True return False dd['col3'] = dd.apply(lambda row: row['col2'] if check_missing_values(row['col1']) else row['col1'], axis=1) 

Hot Network Questions

Subscribe to RSS

To subscribe to this RSS feed, copy and paste this URL into your RSS reader.

Site design / logo © 2023 Stack Exchange Inc; user contributions licensed under CC BY-SA . rev 2023.7.27.43548

By clicking “Accept all cookies”, you agree Stack Exchange can store cookies on your device and disclose information in accordance with our Cookie Policy.

Источник

Читайте также:  Взаимодействие с программами python
Оцените статью