Функция с IF и ELIF с использованием панд - PullRequest
0 голосов
/ 16 января 2019

Как лучше (если он есть) определить функцию, которая проверяет, находится ли столбец панд в заданном диапазоне целых чисел?

У меня есть столбец в кадре данных Pandas, который я хотел проверить, находятся ли значения между заданным диапазоном. Я решил сделать это, создав функцию, которая принимает фрейм данных в качестве аргумента и проверяет, находится ли столбец в диапазоне, используя IF и ELIF. Это может быть хорошо, когда диапазон мал, однако, если диапазон большой, результирующая функция IF, ELIF может быть сложной для поддержания. Есть ли лучший способ добиться этого?

Мой код, который работает-

def fn(dframe):
    if dframe['A'] < 125:
        return 935 + 0.2 * dframe['A']

    elif (dframe['A'] >= 955) and (dframe['A'] <= 974):
        return 921.2 + 0.2 * (dframe['A'] - 955)

    elif (dframe['A'] >= 975) and (dframe['A'] <= 1023):
        return 925.2 + 0.2 * (dframe['BCCH'] - 975)

    elif (dframe['A'] >= 511) and (dframe['A'] <= 885):
        return 1805.2 + 0.2 * (dframe['A'] - 512)

Этот код работает должным образом, однако, если диапазон большой, результирующей функцией трудно управлять.

EDIT:

Спасибо @ycx, @Jorge и всем - мне нравится удобочитаемость вашего кода. Однако мне было интересно, как подход @ ycx. Если у меня есть значения Min и Max 'condlist' в файле csv - например,

condlist_from_CSV_file

тогда я могу прочитать это в информационном кадре. Теперь я хотел бы проверить, находится ли каждая строка столбца «A» в другом кадре данных между этими пределами, и если true, вернуть соответствующий «Выбор», в противном случае вернуть «Нет», имеет ли это смысл? Желаемый вывод -

вывод данных с проверкой

и т. Д.

Ответы [ 2 ]

0 голосов
/ 16 января 2019

Вы можете использовать np.select для управления вашими условиями и опциями. Это позволяет вам легко поддерживать ваши условия и параметры и использует библиотечные функции numpy, которые могут помочь ускорить ваш код

def fn(dframe):
    import numpy as np
    condlist = [
            dframe['A'] < 125, 
            (dframe['A'] >= 955) and (dframe['A'] <= 974),
            (dframe['A'] >= 975) and (dframe['A'] <= 1023),
            (dframe['A'] >= 511) and (dframe['A'] <= 885),
            ]
    choicelist = [
            935 + 0.2 * dframe['A'],
            921.2 + 0.2 * (dframe['A'] - 955),
            925.2 + 0.2 * (dframe['BCCH'] - 975),
            1805.2 + 0.2 * (dframe['A'] - 512),
            ]
    output = np.select(condlist,choicelist)
    return output
0 голосов
/ 16 января 2019

Кажется, вам нужен np.where

import numpy as np
np.where(dframe['A'] < 125, 935 + 0.2 * dframe['A'],
       np.where(dframe['A'] >= 511) & (dframe['A'] <= 885), 1805.2 + 0.2 * (dframe['A'] - 512,
       np.where(dframe['A'] <= 974, 921.2 + 0.2 * (dframe['A'] - 955),
       np.where(dframe['A'] <= 1023, 925.2 + 0.2 * (dframe['A'] - 975),
    'Value for any other value'))))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...