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?
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
Voici un bon moyen pour cela:
df = df[df.columns.drop(list(df.filter(regex='Test')))]
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
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
Cela peut être fait parfaitement en une ligne avec:
df = df.drop(df.filter(regex='Test').columns, axis=1)
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
.