2017-10-10 4 views
1
Duration Protocol Direction Label 
12  tcp  bi  normal-V45 
2   udp  one  Botnet-45 
2   icmp bi  Botnet-68 
3   tcp  one  normal-V73 
5   udp  bi  Background-tcp 
3   icmp one  Background 

Je veux sélectionner les lignes qui ont la dernière colonne (étiquette) comme normal ou Botnet. Je dois vérifier la condition si Label contient normal/Botnet, (ici normal-V45 et normal-V73 sont considérés comme normaux, concept similaire pour botnet). Donc la sortie devrait être:Comment sélectionner les lignes où la dernière colonne du dataframe contient une valeur spécifique

Duration Protocol Direction Label 
12  tcp  bi  normal-V45 
2   udp  one  Botnet-45 
2   icmp bi  Botnet-68 
3   tcp  one  normal-V73 

J'utilise ce qui suit chez les pandas, mais toutes les données sont en csv. Aide appréciée. En attente. Merci beaucoup à l'avance: data1 est la dataframe où toutes les données sont, [~ data1.iloc [:, - 1] .str est pour la sélection de la dernière colonne.

datagrouped = data1.loc[~data1.iloc[:,-1].str == 'Botnet']

+2

double possible de [Comment filtrer les lignes de trame de données si la valeur de la colonne (chaîne) contient l'un des les valeurs dans un ensemble en python?] (https://stackoverflow.com/questions/36167381/how-to-filter-dataframe-rows-if-column-value-string-contains-any-of-the-values) – Vaishali

Répondre

1

Utilisation .str.contans avec regex et l'indexation booléenne:

df[df.Label.str.contains(r'normal|Botnet')] 

sortie:

Duration Protocol Direction  Label 
0  12  tcp  bi normal-V45 
1   2  udp  one Botnet-45 
2   2  icmp  bi Botnet-68 
3   3  tcp  one normal-V73 
+1

Je ne connaissais pas cette fonctionnalité. Comme le montre le manuel (http://pandas.pydata.org/pandas-docs/stable/generated/pandas.Series.str.contains.html), par défaut, il s'agit d'une expression régulière (re module), donc vous pouvez même être plus spécifique, comme 'df [df.Label.str.contains (r '^ (normal | Botnet) \ -')]'. Ou vous pouvez utiliser python sans regex et le combiner vous-même avec les opérateurs booléens comme 'df [df.Label.str.contains ('normal', regex = False) | df.Label.str.contains ('Botnet', regex = False)] '. Dans ce cas, je suppose que le premier doit être préféré. – mkastner

+1

Merci, cela fonctionne :) – Ara