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)?
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.
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.
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 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"