216 votes

Supprimer les colonnes dont le nom contient une chaîne spécifique à partir du DataFrame pandas

J'ai un dataframe pandas avec les noms de colonnes suivants:

Résultat1, Test1, Résultat2, Test2, Résultat3, Test3, etc...

Je veux supprimer toutes les colonnes dont le nom contient le mot "Test". Le nombre de ces colonnes n'est pas statique mais dépend d'une fonction précédente.

Comment puis-je faire cela?

309voto

Voici une façon de le faire :

df = df[df.columns.drop(list(df.filter(regex='Test')))]

119voto

Nic Points 1777
import pandas as pd

import numpy as np

array=np.random.random((2,4))

df=pd.DataFrame(array, columns=('Test1', 'toto', 'test2', 'riri'))

print df

      Test1      toto     test2      riri
0  0.923249  0.572528  0.845464  0.144891
1  0.020438  0.332540  0.144455  0.741412

cols = [c for c in df.columns if c.lower()[:4] != 'test']

df=df[cols]

print df
       toto      riri
0  0.572528  0.144891
1  0.332540  0.741412

118voto

coldspeed Points 111053

Moins cher, plus rapide et plus idiomatique : str.contains

Dans les versions récentes de pandas, vous pouvez utiliser des méthodes de chaîne sur l'index et les colonnes. Ici, str.startswith semble bien adapté.

Pour supprimer toutes les colonnes commençant par une sous-chaîne donnée :

df.columns.str.startswith('Test')
# array([ True, False, False, False])

df.loc[:,~df.columns.str.startswith('Test')]

  toto test2 riri
0    x     x    x
1    x     x    x

Pour une correspondance insensible à la casse, vous pouvez utiliser une correspondance basée sur regex avec str.contains avec un ancrage SOL :

df.columns.str.contains('^test', case=False)
# array([ True, False,  True, False])

df.loc[:,~df.columns.str.contains('^test', case=False)] 

  toto riri
0    x    x
1    x    x

Si des types mixtes sont possibles, spécifiez na=False également.

39voto

Warren O'Neill Points 49

Cela peut être fait proprement en une seule ligne avec :

df = df.drop(df.filter(regex='Test').columns, axis=1)

22voto

SAH Points 269

Vous pouvez filtrer les colonnes que vous VOULEZ en utilisant 'filter'

import pandas as pd
import numpy as np

data2 = [{'test2': 1, 'result1': 2}, {'test': 5, 'result34': 10, 'c': 20}]

df = pd.DataFrame(data2)

df

c   result1     result34    test    test2
0   NaN     2.0     NaN     NaN     1.0
1   20.0    NaN     10.0    5.0     NaN

Maintenant, filtrez

df.filter(like='result',axis=1)

Obtenez..

   result1  result34
0   2.0     NaN
1   NaN     10.0

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X