it-swarm.com.de

Löschen mehrerer Spalten basierend auf Spaltennamen in Pandas

Ich habe einige Daten, und wenn ich sie importiere, bekomme ich die folgenden nicht benötigten Spalten. Ich suche nach einer einfachen Möglichkeit, alle diese zu löschen

   'Unnamed: 24', 'Unnamed: 25', 'Unnamed: 26', 'Unnamed: 27',
   'Unnamed: 28', 'Unnamed: 29', 'Unnamed: 30', 'Unnamed: 31',
   'Unnamed: 32', 'Unnamed: 33', 'Unnamed: 34', 'Unnamed: 35',
   'Unnamed: 36', 'Unnamed: 37', 'Unnamed: 38', 'Unnamed: 39',
   'Unnamed: 40', 'Unnamed: 41', 'Unnamed: 42', 'Unnamed: 43',
   'Unnamed: 44', 'Unnamed: 45', 'Unnamed: 46', 'Unnamed: 47',
   'Unnamed: 48', 'Unnamed: 49', 'Unnamed: 50', 'Unnamed: 51',
   'Unnamed: 52', 'Unnamed: 53', 'Unnamed: 54', 'Unnamed: 55',
   'Unnamed: 56', 'Unnamed: 57', 'Unnamed: 58', 'Unnamed: 59',
   'Unnamed: 60'

Sie werden durch 0-Indexierung indiziert, also habe ich so etwas ausprobiert 

    df.drop(df.columns[[22, 23, 24, 25, 
    26, 27, 28, 29, 30, 31, 32 ,55]], axis=1, inplace=True)

Das ist aber nicht sehr effizient. Ich habe versucht, einige für Loops zu schreiben, aber das erschien mir als schlechtes Pandas-Verhalten. Daher stelle ich die Frage hier.

Ich habe einige Beispiele gesehen, die ähnlich sind ( Mehrere Pandas löschen ), aber das beantwortet meine Frage nicht. 

57
Peadar Coyle

Ich weiß nicht, was Sie mit ineffizient meinen, aber wenn Sie in Bezug auf Typisierung meinen, könnte es einfacher sein, einfach die gewünschten Spalten auszuwählen und sie wieder dem df zuzuordnen:

df = df[cols_of_interest]

Dabei ist cols_of_interest eine Liste der Spalten, die Sie interessieren.

Oder Sie können die Spalten in Scheiben schneiden und dies an drop übergeben:

df.drop(df.ix[:,'Unnamed: 24':'Unnamed: 60'].head(0).columns, axis=1)

Der Aufruf von head wählt nur 0 Zeilen aus, da uns nur die Spaltennamen und nicht die Daten interessieren

Update

Eine andere Methode wäre die Verwendung der booleschen Maske aus str.contains und deren Invertierung, um die Spalten zu maskieren:

In [2]:
df = pd.DataFrame(columns=['a','Unnamed: 1', 'Unnamed: 1','foo'])
df

Out[2]:
Empty DataFrame
Columns: [a, Unnamed: 1, Unnamed: 1, foo]
Index: []

In [4]:
~df.columns.str.contains('Unnamed:')

Out[4]:
array([ True, False, False,  True], dtype=bool)

In [5]:
df[df.columns[~df.columns.str.contains('Unnamed:')]]

Out[5]:
Empty DataFrame
Columns: [a, foo]
Index: []
38
EdChum

Der mit Abstand einfachste Ansatz ist:

yourdf.drop(['columnheading1', 'columnheading2'], axis=1, inplace=True)
139
Philipp Schwarz

Mein persönlicher Favorit und einfacher als die Antworten, die ich hier (für mehrere Spalten) gesehen habe:

df.drop(df.columns[22:56], axis=1, inplace=True)

Oder erstellen Sie eine Liste für mehrere Spalten.

col = list(df.columns)[22:56]
df.drop(col, axis=1, inplace=1)
23
sheldonzy

Dies ist wahrscheinlich eine gute Möglichkeit, das zu tun, was Sie möchten. Es werden alle Spalten gelöscht, die in ihrer Kopfzeile "Unbenannt" enthalten.

for col in df.columns:
    if 'Unnamed' in col:
        del df[col]
15
knightofni

Sie können dies in einer Zeile und auf einmal tun:

df.drop([col for col in df.columns if "Unnamed" in col], axis=1, inplace=True)

Dies erfordert weniger Bewegen/Kopieren des Objekts als die obigen Lösungen.

8
Peter

Ich bin nicht sicher, ob diese Lösung bereits erwähnt wurde, aber eine Möglichkeit ist pandas.Index.difference .

>>> df = pd.DataFrame(columns=['A','B','C','D'])
>>> df
Empty DataFrame
Columns: [A, B, C, D]
Index: []
>>> to_remove = ['A','C']
>>> df = df[df.columns.difference(to_remove)]
>>> df
Empty DataFrame
Columns: [B, D]
Index: []
7
px06

Das Folgende hat für mich funktioniert:

for col in df:
    if 'Unnamed' in col:
        #del df[col]
        print col
        try:
            df.drop(col, axis=1, inplace=True)
        except Exception:
            pass
1
Shivgan

df = df [[Spalte für Spalte in df.columns, wenn "Unbenannt" nicht in Spalte]]

0
Sarah