Ich habe einen Pandas-Datenrahmen mit den folgenden Spaltennamen:
Ergebnis1, Test1, Ergebnis2, Test2, Ergebnis3, Test3 usw.
Ich möchte alle Spalten löschen, deren Name das Wort "Test" enthält. Die Anzahl solcher Spalten ist nicht statisch, sondern hängt von einer vorherigen Funktion ab.
Wie kann ich das machen?
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
Hier ist ein guter Weg dazu:
df = df[df.columns.drop(list(df.filter(regex='Test')))]
Verwenden Sie die DataFrame.select
-Methode:
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
Sie können die von Ihnen gewünschten Spalten mit 'filter' herausfiltern
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
Jetzt filtern
df.filter(like='result',axis=1)
Erhalten..
result1 result34
0 2.0 NaN
1 NaN 10.0
Dies kann in einer Zeile mit:
df = df.drop(df.filter(regex='Test').columns, axis=1)
In neueren Versionen von Pandas können Sie String-Methoden für den Index und die Spalten verwenden. str.startswith
scheint hier eine gute Passform zu sein.
So entfernen Sie alle Spalten, die mit einem bestimmten Teilstring beginnen:
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
Für den Vergleich zwischen Groß- und Kleinschreibung können Sie den regex-basierten Abgleich mit str.contains
mit einem SOL -Anker verwenden:
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
wenn mixed-types möglich ist, geben Sie auch na=False
an.