web-dev-qa-db-fra.com

Création d'une nouvelle colonne basée sur la condition if-Elif-else

J'ai un DataFrame df:

    A    B
a   2    2 
b   3    1
c   1    3

Je souhaite créer une nouvelle colonne en fonction des critères suivants:

si rangée A == B: 0

si rowA > B: 1

si rangée A < B: -1 

donc, étant donné le tableau ci-dessus, il devrait être:

    A    B    C
a   2    2    0
b   3    1    1
c   1    3   -1 

Pour les cas typiques de if else que je fais np.where(df.A > df.B, 1, -1), les pandas fournissent-ils une syntaxe spéciale pour résoudre mon problème en une étape (sans qu'il soit nécessaire de créer 3 nouvelles colonnes et de combiner le résultat)? 

30
nutship

Pour formaliser certaines des approches exposées ci-dessus:

Créez une fonction qui agit sur les lignes de votre image de données de la manière suivante:

def f(row):
    if row['A'] == row['B']:
        val = 0
    Elif row['A'] > row['B']:
        val = 1
    else:
        val = -1
    return val

Puis appliquez-le à votre cadre de données en passant par l'option axis=1:

In [1]: df['C'] = df.apply(f, axis=1)

In [2]: df
Out[2]:
   A  B  C
a  2  2  0
b  3  1  1
c  1  3 -1

Bien entendu, ceci n’est pas vectorisé et les performances risquent donc de ne pas être aussi bonnes lorsqu’elles sont adaptées à un grand nombre d’enregistrements. Pourtant, je pense que c'est beaucoup plus lisible. Surtout venant d'un arrière-plan SAS.

57
Zelazny7
df.loc[df['A'] == df['B'], 'C'] = 0
df.loc[df['A'] > df['B'], 'C'] = 1
df.loc[df['A'] < df['B'], 'C'] = -1

Facile à résoudre en utilisant l'indexation. La première ligne de code se lit comme suit: si la colonne "A" est égale à la colonne "B", créez et définissez la colonne "C" sur 0. Remarque: je n'ai pas essayé de l'exécuter, il est donc possible que le code soit modifié. pour ce qui suit, df.ix [(df ['A'] == df ['B']), 'C'] = 0, qui utilise des parenthèses autour de la condition.

9
Brian

Pour cette relation particulière, vous pouvez utiliser np.sign:

>>> df["C"] = np.sign(df.A - df.B)
>>> df
   A  B  C
a  2  2  0
b  3  1  1
c  1  3 -1
6
DSM

 enter image description here

Disons que ci-dessus est votre cadre de données d'origine et que vous souhaitez ajouter une nouvelle colonne 'old' 

Si l'âge est supérieur à 50 ans, nous considérons comme plus âgé = oui sinon Faux

étape 1: Obtenir les index des lignes dont l'âge est supérieur à 50 ans 

row_indexes=df[df['age']>=50].index 

étape 2: En utilisant .loc nous pouvons assigner une nouvelle valeur à la colonne 

df.loc[row_indexes,'elderly']="yes"

même pour les moins de 50 ans 

row_indexes=df[df['age']<50].index 

df[row_indexes,'elderly']="no" 

1
Ravi G