J'ai un data-frame comme
colA colB colC final A B C A A D C D B B E E A D C D C B C C
Je veux les filtrer dans une priorité comme celle-ci: Si colC == E alors retourne E, après cela vérifie colB == D retourne D sinon retourne colA Le résultat est
colA colB colC A B C A D C B B E A D C C B C
5 Réponses :
Créez la condition Series , la chaîne avec bfill et fillna
s=pd.Series({'colB':'D','colC':'E'})
df['New']=df.where(df.eq(s)).bfill(1).iloc[:,0].fillna(df.colA)
>>> df
colA colB colC New
0 A B C A
1 A D C D
2 B B E E
3 A D C D
4 C B C C
Vous pouvez utiliser np .select , qui vous permet de sélectionner parmi plusieurs valeurs en fonction d'une liste de conditions:
m1 = df.colC =='E' m2 = df.colB =='D' df.loc[:,'final'] = np.select([m1,m2], ['E', 'D'], default=df.colA) colA colB colC final 0 A B C A 1 A D C D 2 B B E E 3 A D C D 4 C B C C
C'est ce à quoi j'allais répondre.
Mon préféré est d'utiliser un mask () chaîné, comme ceci:
df["final"] = df["colA"] \
.mask(df["colB"].eq("D"), "D") \
.mask(df["colC"].eq("E"), "E")
Ceci est pour présenter votre séquence if-then-elif dans l'ordre inverse exact de vérification, mais sinon très lisible.
en utilisant np.where Output final colA colB colC final
0 A B C A
1 A D C D
2 B B E E
3 A D C D
4 C B C C
t['final'] = np.where(t['colC'] == 'E', 'E', (np.where(t['colB'] == 'D', 'D', t['colA'])))
Je suis juste en train d'expérimenter
a = df.colA.values.copy() # Set lowest priority first a[np.flatnonzero(df.colB == 'D')] = 'D' # And on down the line a[np.flatnonzero(df.colC == 'E')] = 'E' # Highest priority last df.assign(New=a) colA colB colC New 0 A B C A 1 A D C D 2 B B E E 3 A D C D 4 C B C C