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)?
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.
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.
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
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 ansrow_indexes=df[df['age']<50].index
df[row_indexes,'elderly']="no"
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