Заменить Python условных выражений словарем - PullRequest
1 голос
/ 24 апреля 2020

Как можно решить следующее, применив словари в Python Идея состоит в том, чтобы удалить оператор if, заменить его словарем и получить тот же результат.

def apply_fun(row,col='a'):
    if row[col] <= 5:
        val = 5
    elif row[col] <= 10:
        val = 10
    elif row[col] <= 15:
        val = 15
    elif row[col] <= 20:
        val = 20
    elif row[col] <= 25:
        val = 25        
    else:
        val = 30
    return val

values = [[12,2],[3,2],[23,2],[7,2],[19,2]]

db = pd.DataFrame(values, columns = ['a','b'])

db['new'] = db.apply(apply_fun, axis=1)

    a   b   new
0   12  2   15
1   3   2   5
2   23  2   25
3   7   2   10
4   19  2   20

Ответы [ 3 ]

1 голос
/ 24 апреля 2020

Когда вы округляете до ближайших кратных 5, используйте:

import numpy as np

db["new"] =  np.ceil(db["a"] / 5).astype(int) * 5
print(db)

Это печатает:

    a  b  new
0  12  2   15
1   3  2    5
2  23  2   25
3   7  2   10
4  19  2   20
1 голос
/ 24 апреля 2020

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

def apply_fun(row,col='a'):
    limits = [5, 12, 15, 18, 25, 30]
    for i in limits:
        if row[col] <= i:
            return i
    return limits[-1] # default to the last item

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

1 голос
/ 24 апреля 2020

Вы просто округляете числа до ближайших 5. Вместо этого вы можете сделать это:

db['new'] = db['a'].add(4).floordiv(5).mul(5)

    a   b   new
0   12  2   15
1   3   2   5
2   23  2   25
3   7   2   10
4   19  2   20

Если, однако, вы говорите о проверке словаря на предмет диапазона, то это невозможно, поскольку словарь сопоставляется один в один. Если вы не хотите начать идентифицировать {1: 5, 2: 5, 3: 5, ...}.

...