2015-12-14 3 views
1

J'ai une trame de données de pandas géants:Sélection de lignes par condition

df_total_data2 

qui ont les colonnes suivantes:

df_total_data.columns 

Index([u'BBBlink', u'Name', u'_type'], dtype='object') 

Je veux laisser tomber les toutes les lignes qui ne satisfont pas une donnée condition, dans ce cas la condition est que la colonne ne peut pas contenir le mot secure Je veux laisser tomber la ligne à l'endroit, ne pas avoir une fonction qui renvoient None si la condition n'est pas satisfaite.

Alors je vous écris cette fonction:

df_total_data.apply(lambda x: 'secure' not in x['BBBlink'],1).values 

qui renvoie un tableau booléen, mais je ne sais pas comment utiliser pour déposer la ligne.

Edit:

Je suis un tableau:

array([ True, True, True, True, True,False....True]) 

Maintenant, comment puis-je utiliser ce tableau pour déposer les colonnes?

+0

Pouvez-vous fournir une structure échantillon 'DataFrame' et les résultats escomptés et la sortie ou l'erreur que vous avez obtenu. – The6thSense

Répondre

1

Une fois que vous avez un tableau booléen, vous pouvez sélectionner uniquement les lignes où il est True en faisant df[boolean_array] ou seulement les lignes où il est False en ajoutant ~, df[~boolean_array].

Quant à votre question, vous pouvez utiliser la méthode drop ou le faire vous-même:

df_total_data[df_total_data.apply(lambda x: 'secure' not in x['BBBlink'],1).values] 

Rappelez-vous simplement que ce n'est pas inplace donc vous devez soit attribuer la valeur renvoyée à une nouvelle dataframe ou re -affecter à l'existant.

Par ailleurs, vous pouvez simplifier votre condition un peu:

df_total_data[df_total_data['BBBlink'].apply(lambda x: 'secure' not in x)] 
1

IIUC vous pouvez utiliser isin:

print df_total_data 
    BBBlink Name _type 
0 secure name  A 
1 secure name  A 
2 secure name  A 
3 secure name  A 
4 secure name  A 
5  sre name  A 

print df_total_data.BBBlink.isin(['secure']) 
0  True 
1  True 
2  True 
3  True 
4  True 
5 False 
Name: BBBlink, dtype: bool 

print df_total_data[df_total_data.BBBlink.isin(['secure'])] 
    BBBlink Name _type 
0 secure name  A 
1 secure name  A 
2 secure name  A 
3 secure name  A 
4 secure name  A 

print df_total_data[~df_total_data.BBBlink.isin(['secure'])] 
    BBBlink Name _type 
5  sre name  A 

Mais si la chaîne est avec d'autres chaînes, vous pouvez utiliser str.contains:

print df_total_data 
     BBBlink Name _type 
0  secure qq name  A 
1  secure name  A 
2  secure name  A 
3  secure name  A 
4 secure aa ss name  A 
5   sre name  A 

print df_total_data[~df_total_data.BBBlink.str.contains('secure')] 
BBBlink Name _type 
5  sre name  A 
+0

Cela ne fonctionnera pas totalement. S'il y a bla secure blah dans une rangée, isin ne l'attrape pas. – DeepSpace

+0

Je reçois toujours faux, Dans ce cas, «sécurisé» fait partie d'une chaîne plus grande pas l'ensemble de l'élément, je n'ai pas mis cela clair –