3
votes

Filtre de trame de données selon une condition

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 


0 commentaires

5 Réponses :


4
votes

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


0 commentaires

4
votes

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


1 commentaires

C'est ce à quoi j'allais répondre.



3
votes

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.


0 commentaires

2
votes

en utilisant np.where

  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

Output final

t['final'] = np.where(t['colC'] == 'E', 'E', (np.where(t['colB'] == 'D', 'D', t['colA'])))


0 commentaires

3
votes

Ne prenez pas cela au sérieux

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


0 commentaires