Ich habe einige Daten und wenn ich sie importiere, erhalte ich die folgenden nicht benötigten Spalten. Ich suche nach einer einfachen Möglichkeit, all 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-Indizierung indiziert, also habe ich so etwas versucht
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 kam mir als schlechtes Pandas-Verhalten vor. Daher stelle ich hier die Frage.
Ich habe einige ähnliche Beispiele gesehen ( Pandas mit mehreren Spalten löschen ), aber dies beantwortet meine Frage nicht.
df.drop
eine Liste der Spaltennamen angeben können:df.drop(['Unnamed: 24', 'Unnamed: 25', ...], axis=1)
df = df[cols_of_interest]
Sie könnten den df nach Spaltendf.drop(df.ix[:,'Unnamed: 24':'Unnamed: 60'].head(0).columns, axis=1)
Antworten:
Ich weiß nicht, was Sie unter ineffizient verstehen, aber wenn Sie in Bezug auf die Eingabe meinen, könnte es einfacher sein, einfach die interessierenden Spalten auszuwählen und dem df wieder zuzuweisen:
Wo
cols_of_interest
ist eine Liste der Spalten, die Sie interessieren.Oder Sie können die Spalten in Scheiben schneiden und diese übergeben an
drop
:Der Aufruf,
head
nur 0 Zeilen auszuwählen, da wir nur an den Spaltennamen und nicht an den Daten interessiert sindaktualisieren
Eine andere Methode: Es wäre einfacher, die Boolesche Maske von zu verwenden
str.contains
und sie zu invertieren, um die Spalten zu maskieren:quelle
df
mit deiner neuen Kolumne, solltest duappend
vielleicht, aber ich verstehe deine Frage nicht wirklich, du solltest eine echte Frage auf SO posten, anstatt als Kommentar zu fragen, da es eine schlechte Form auf SO istDer mit Abstand einfachste Ansatz ist:
quelle
SettingWithCopyWarning
Warnung?axis
erklärt: stackoverflow.com/questions/22149584/… . Im Wesentlichenaxis=0
wird gesagt, "spaltenweise" undaxis=1
"zeilenweise" zu sein.inplace=True
bedeutet, dass dasDataFrame
an Ort und Stelle geändert wird.yourdf = yourdf.drop(['columnheading1', 'columnheading2'], axis=1)
Mein persönlicher Favorit und einfacher als die Antworten, die ich hier gesehen habe (für mehrere Spalten):
Oder erstellen Sie eine Liste für mehrere Spalten.
quelle
Dies ist wahrscheinlich ein guter Weg, um das zu tun, was Sie wollen. Es werden alle Spalten gelöscht, deren Kopfzeile "Unbenannt" enthält.
quelle
for col in df.columns:
kann vereinfacht werdenfor col in df:
, auch das OP hat nicht angegeben, was das Benennungsschema für die anderen Spalten ist, sie könnten alle 'Unbenannt' enthalten, auch dies ist ineffizient, da es die Spalteninplace = True
Sie können dies in einer Zeile und auf einmal tun:
Dies beinhaltet weniger Bewegen / Kopieren des Objekts als die obigen Lösungen.
quelle
Ich bin mir nicht sicher, ob diese Lösung bereits irgendwo erwähnt wurde, aber eine Möglichkeit ist dies
pandas.Index.difference
.quelle
Sie können die Spaltennamen einfach als Liste übergeben, indem Sie die Achse als 0 oder 1 angeben
Standardmäßig ist Achse = 0
data.drop(["Colname1","Colname2","Colname3","Colname4"],axis=1)
quelle
Das Folgende hat bei mir funktioniert:
quelle
Simpel und einfach. Entfernen Sie alle Spalten nach dem 22 ..
quelle
df = df[[col for col in df.columns if not ('Unnamed' in col)]]
quelle