Расширенное многоконтекстное списковое включение

Вопрос или проблема

Расширенное многоконтекстное списковое включение

Я новичок в Python и хотел бы присвоить значение на основе математических операций, например “right”, если >, “left”, если <, "equal", если ==, в рамках генератора списков.

Я пробовал следующую конструкцию, но она вызывает ошибку. Можно ли указать несколько условий в одном генераторе списков таким образом, чтобы каждый “elif” генерировал разный результат, или мне нужно использовать цикл?

Полностью воспроизводимый пример:

from sklearn.datasets import load_iris

bunch = load_iris(as_frame=True)
df = bunch.data.reset_index().rename(columns={"index": "id"}).merge(bunch.target.reset_index().rename(columns={"index": "id"})).drop(["id"], axis=1)

# вопрос в последнем столбце, "skew"
datasummary_dct = {
   "50%": [df[col].median().round(2) if any(t in str(df[col].dtype) for t in ("float", "int", "time")) else " " for col in df.columns],
   "mean": [df[col].mean().round(2) if any(t in str(df[col].dtype) for t in ("float", "int", "time")) else " " for col in df.columns],
   "skew": ["left" if df[col].median() > df[col].mean() else "right" if df[col].median() < df[col].mean() else "equal" if df[col].median()==df[col].mean() if any(t in str(df[col].dtype) for t in ("float", "int", "time")) else " " for col in df.columns],
}

Я всё ещё довольно нов в программировании; извините, если я сразу не понимаю решение. Буду признателен за любую помощь!

Ответ или решение

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

Вот ваш код с исправлениями:

from sklearn.datasets import load_iris

# Загружаем набор данных Iris
bunch = load_iris(as_frame=True)
df = bunch.data.reset_index().rename(columns={"index": "id"}).merge(bunch.target.reset_index().rename(columns={"index": "id"})).drop(["id"], axis=1)

# Создаём словарь сsummary
datasummary_dct = {
    "50%": [df[col].median().round(2) if any(t in str(df[col].dtype) for t in ("float", "int", "time")) else " " for col in df.columns],
    "mean": [df[col].mean().round(2) if any(t in str(df[col].dtype) for t in ("float", "int", "time")) else " " for col in df.columns],
    "skew": [
        "left" if df[col].median() > df[col].mean() else 
        "right" if df[col].median() < df[col].mean() else 
        "equal" if df[col].median() == df[col].mean() else 
        " " 
        for col in df.columns if any(t in str(df[col].dtype) for t in ("float", "int", "time"))
    ]
}

print(datasummary_dct)

Объяснение изменений:

  1. Условные конструкции: В разделе "skew" были исправлены тернарные операторы. Мы применили последовательные тернарные операторы, чтобы проверить условия и вернуть соответствующие значения ("left", "right", "equal"). Эти операторы именно в соответствии с вашим вопросом.

  2. Фильтрация типов: Добавлено условие if в конце, чтобы убедиться, что мы обрабатываем только столбцы с числовыми данными (float, int, time). Этот if был вынесен из внутриfor-цикла, чтобы избежать необходимости проверять это условие для каждого условия.

  3. Использование круглых скобок: Правильное согласование условий и структурирования кода упрощает чтение и уменьшает вероятность ошибок.

Теперь, когда вы запустите приведенный выше код, он должен правильно создать словарь с трех категорий: "50%", "mean" и "skew". Если у вас будут дополнительные вопросы, не стесняйтесь задавать их!

Оцените материал
Добавить комментарий

Капча загружается...