web-dev-qa-db-fra.com

Supprime les colonnes dont le nom contient une chaîne spécifique de pandas DataFrame

J'ai une base de données pandas avec les noms de colonne suivants:

Result1, Test1, Result2, Test2, Result3, 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 ça?

40
Alexis Eggermont
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
32
Nic

Voici un bon moyen pour cela:

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

Utilisez la méthode DataFrame.select:

In [38]: df = DataFrame({'Test1': randn(10), 'Test2': randn(10), 'awesome': randn(10)})

In [39]: df.select(lambda x: not re.search('Test\d+', x), axis=1)
Out[39]:
   awesome
0    1.215
1    1.247
2    0.142
3    0.169
4    0.137
5   -0.971
6    0.736
7    0.214
8    0.111
9   -0.214
7
Phillip Cloud

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 filtrer

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

Obtenir..

   result1  result34
0   2.0     NaN
1   NaN     10.0
6
SAH

Cela peut être fait parfaitement en une ligne avec:

df = df.drop(df.filter(regex='Test').columns, axis=1)
2
Warren O'Neill

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 être un bon choix.

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 ne respectant pas la casse, vous pouvez utiliser une correspondance basée sur regex avec str.contains avec une ancre 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 une combinaison de types est une possibilité, spécifiez également na=False.

1
coldspeed