2017-09-14 1 views
1

J'ai un pandas DataFrame comme indiqué ci-dessous. Je veux sélectionner toutes les colonnes qui se terminent par "_cd" ou "_ind" à l'exception de la colonne "final_ind". Comment puis je faire ça?regex sélection des colonnes qui contiennent une chaîne sauf une

df = pd.DataFrame({ 
    'var1': [20, 30.0, 40], 
    'var2_ind': ["a4", "a3", "b1"], 
    'var3_cd': [10, 5, 7], 
    'final_ind': [1, 0, 1], 
}) 

Voici ce que j'ai essayé:

df.ix[:, df.columns.str.contains('_cd|_ind')] #Gets all columns except var1 
df.ix[:, df.columns.str.contains('_cd|_ind[^final_ind]')] #Gets only var3_cd 

Répondre

3

Vous pouvez utiliser filter avec regex comme ceci:

df.filter(regex='^(?!final).*(_cd|_ind)$') 

# var2_ind var3_cd 
#0  a4  10 
#1  a3  5 
#2  b1  7 

  • ^(?!final) affirmera les noms de colonnes n » t commencer par final grâce à regard négatif à l'avance (?!...); Correspond aux noms des colonnes se terminant par _cd ou _ind;
2

Une autre solution sans utiliser negative look ahead RegEx:

In [24]: df[df.columns[df.columns.str.contains('(?:_cd|_ind)$')].drop('final_ind')] 
Out[24]: 
    var2_ind var3_cd 
0  a4  10 
1  a3  5 
2  b1  7 
+0

@ WiktorStribiżew, oui, en effet, merci pour le signaler! – MaxU