2017-09-25 3 views
-1

J'ai essayé de filtrer mes pandas DataFrame en fonction de deux conditions (if, else). Seule l'instruction if fonctionne. L'instruction if conserve (indicateurs) tous les enregistrements dans mon DataFrame en fonction de 2 conditions (logic1 et logic2). Voir la section 4.Exclure des enregistrements de pandas DataFrame basé sur les valeurs de colonne

Dans la déclaration else, je voudrais exclure tous les ids qui ont été signalés (logic1 et logic2), sans créer une liste supplémentaire ou en boucle sur chaque enregistrement. Existe-t-il un moyen de filtrer tous ces enregistrements sans stocker les ID dans une liste supplémentaire?

Je souhaite utiliser uniquement les fonctions de filtrage, si possible. Actuellement, je reçois la sortie de la section 3. C'est faux parce que id = 2 a été marqué, mais est toujours inclus dans la sortie. La sortie I besoin est indiqué à la section 4.

code

logic1 = (potatoes['Desc'] == 'Bla2') & (potatoes['Value'] == True) & (potatoes['Enabled'] == True) 
logic2 = (potatoes['Desc'].isin(['Bla8', 'Bla9'])) & (potatoes['Active'] == True) & (potatoes['Enabled'] == True) 

if flagged: 
    potatoes_flagged = potatoes[logic1 | logic2] 
    return potatoes_flagged 
else: 
    potatoes_not_flagged = potatoes[~logic1 & ~logic2] 
    return potatoes_not_flagged 

1. Entrée (pommes de terre)

id | Desc | Active | Enabled | Value | [A LOT OF OTHER COLUMNS] 
1 | Bla1 | 1  | 0  | 1  | [A LOT OF OTHER COLUMNS] 
2 | Bla2 | 1  | 1  | 1  | [A LOT OF OTHER COLUMNS] 
2 | Bla3 | 1  | 1  | 0  | [A LOT OF OTHER COLUMNS] 
2 | Bla4 | 0  | 0  | 0  | [A LOT OF OTHER COLUMNS] 
2 | Bla5 | 0  | 0  | 0  | [A LOT OF OTHER COLUMNS] 
3 | Bla6 | 1  | 1  | 0  | [A LOT OF OTHER COLUMNS] 
4 | Bla7 | 0  | 0  | 1  | [A LOT OF OTHER COLUMNS] 

2. Sortie pour battant pavillon (si) (CORRECT

id | Desc | Active | Enabled | Value | [A LOT OF OTHER COLUMNS] 
2 | Bla2 | 1  | 1  | 1  | [A LOT OF OTHER COLUMNS] 

3. Sortie pour ne pas signalé (autre) (MAL)

id | Desc | Active | Enabled | Value | [A LOT OF OTHER COLUMNS] 
1 | Bla1 | 1  | 0  | 1  | [A LOT OF OTHER COLUMNS] 
2 | Bla3 | 1  | 1  | 0  | [A LOT OF OTHER COLUMNS] 
2 | Bla4 | 0  | 0  | 0  | [A LOT OF OTHER COLUMNS] 
2 | Bla5 | 0  | 0  | 0  | [A LOT OF OTHER COLUMNS] 
3 | Bla6 | 1  | 1  | 0  | [A LOT OF OTHER COLUMNS] 
4 | Bla7 | 0  | 0  | 1  | [A LOT OF OTHER COLUMNS] 

4. Sortie nécessaire pour ne pas signalé (CORRECT)

id | Desc | Active | Enabled | Value | [A LOT OF OTHER COLUMNS] 
1 | Bla1 | 1  | 0  | 1  | [A LOT OF OTHER COLUMNS] 
3 | Bla6 | 1  | 1  | 0  | [A LOT OF OTHER COLUMNS] 
4 | Bla7 | 0  | 0  | 1  | [A LOT OF OTHER COLUMNS] 
+0

Je pense que vous avez besoin de 'pommes de terre [~ (logique1 & logique2)]', mais votre sortie attendue est fausse? –

+0

car, d'après vos données, id = 2 n'est jamais signalé ici. –

+0

Je ne vois pas pourquoi 'id = 2' n'est jamais marqué et aussi' ~ logic1 & ~ logic2' semble correct. – orangetacos

Répondre

1

On dirait que vous voulez trouver tous les id s qui ne sont pas retournés par potatoes[logic1 | logic2]. Vous pouvez utiliser un appel isin inversé pour le faire.

idx_flagged = potatoes.loc[logic1 | logic2, 'id'].values 
potatoes[~potatoes.id.isin(idx_flagged)] 

    id Desc Active Enabled Value 
0 1 Bla1  1  0  1 
5 3 Bla6  1  1  0 
6 4 Bla7  0  0  1 
+1

Merci pour votre réponse. Cela a répondu à ma question. – orangetacos