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 veux créer une nouvelle colonne basée sur les critères suivants:

si la ligne A == B: 0

si la ligneA > B: 1

si la ligne A < B: -1

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

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

type if else cas je ne np.where(df.A > df.B, 1, -1), est-ce que pandas fournit une syntaxe spéciale pour résoudre mon problème avec une étape (sans la nécessité de créer 3 nouvelles colonnes et puis combiner le résultat)?

28
demandé sur nutship 2014-02-11 16:49:58

5 réponses

Pour la formalisation de certaines des approches exposées ci-dessus:

Créer une fonction qui opère sur les lignes de votre dataframe comme suit:

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

alors appliquez-le à votre dataframe passant dans le axis=1 option:

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 sûr, ce n'est pas vectorisé de sorte que les performances peuvent ne pas être aussi bien lors de la mise à l'échelle pour un grand nombre d'enregistrements. Pourtant, je pense que c'est beaucoup plus lisible. Surtout venant d'un SAS d'arrière-plan.

52
répondu Zelazny7 2014-02-11 20:04:43
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 ceci, si la colonne 'A' est égale à la colonne 'B' alors créer et mettre la colonne 'C' égale à 0. Notez que je n'ai pas essayé d'exécuter ceci, donc le code pourrait devoir être modifié comme suit, df.ix [(df ['A'] = = df ['B']),' C'] = 0, qui utilise des parenthèses autour de la condition.

7
répondu Brian 2018-06-13 16:16:45

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
5
répondu DSM 2014-02-11 13:02:31

enter image description here

disons au-dessus d'un est votre dataframe original et vous voulez ajouter une nouvelle colonne 'ancien'

si l'âge est supérieur à 50 ans alors nous considérons comme plus âgé=Oui autrement faux

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



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



étape 2: Utiliser. nous pouvons attribuer une nouvelle valeur à la colonne



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

idem pour les moins de 50 ans



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



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

1
répondu Ravi Gurnatham 2018-09-12 20:23:06

Les opérations en ligne peuvent prendre trop de temps pour les grands ensembles de données. Une meilleure approche consiste à trouver l'index des lignes correspondant à la condition, puis à attribuer des valeurs à la colonne requise ('C') de ces lignes.

df.loc[df['A'] == df['B'], 'C'] = 0
df.loc[df['A'] > df['B'], 'C'] = 1
df.loc[df['A'] < df['B'], 'C'] = -1
0
répondu arunsankar 2018-03-14 03:02:08