Comment résoudre les problèmes suivants en appliquant des dictionnaires en Python L'idée est de supprimer le si et de le remplacer par un dictionnaire et d'obtenir le même résultat.

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
1
Josef 24 avril 2020 à 20:43

3 réponses

Meilleure réponse

Lorsque vous arrondissez au multiple de 5 le plus proche, utilisez:

import numpy as np

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

Cela imprime:

    a  b  new
0  12  2   15
1   3  2    5
2  23  2   25
3   7  2   10
4  19  2   20
1
Shubham Sharma 24 avril 2020 à 18:02

Vous arrondissez simplement les nombres aux 5 secondes les plus proches. Vous pouvez le faire à la place:

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

Si toutefois vous parlez de vérifier un dictionnaire pour la plage, ce n'est pas faisable, car les dictionnaires sont mappés un à un. À moins que vous ne vouliez commencer à identifier {1: 5, 2: 5, 3: 5, ...}.

1
r.ook 24 avril 2020 à 17:57

Je ne ferais pas ça avec un dictionnaire. Lorsque la commande est importante, utilisez une liste.

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

Notez que cela ne doit être utilisé que s'il n'y a pas de solution mathématique simple comme dans les autres réponses.

1
Barmar 24 avril 2020 à 18:06