Beim Löschen einer Spalte in einem DataFrame verwende ich:
del df['column_name']
Und das funktioniert super. Warum kann ich Folgendes nicht verwenden?
del df.column_name
Da es möglich ist, auf die Spalte / Serie als zuzugreifen df.column_name
, habe ich erwartet, dass dies funktioniert.
Antworten:
Wie Sie vermutet haben, ist die richtige Syntax
del df.column_name
Aufgrund syntaktischer Einschränkungen in Python ist es schwierig, die Arbeit einfach zu machen .del df[name]
wirddf.__delitem__(name)
von Python unter die Decke übersetzt .quelle
class A(object): def __init__(self): self.var = 1
richtet eine Klasse ein unda = A(); del a.var
funktioniert danndel df[name]
übersetzt,df.__delitem__(name)
die DataFrame implementieren und an seine Anforderungen anpassen kann. Im Fall vondel df.name
wird die Mitgliedsvariable entfernt, ohne dass die Möglichkeit besteht, dass benutzerdefinierter Code ausgeführt wird. Betrachten Sie Ihr eigenes Beispiel - können Sie dendel a.var
Ausdruck "Variable löschen" erhalten? Wenn du kannst, sag mir bitte wie. Ich kann nicht :)pandas
Entwickler haben es nicht getan , aber das bedeutet nicht, dass es schwierig ist, dies zu tun.Der beste Weg, dies bei Pandas zu tun, ist
drop
:Wo
1
ist die Achsnummer (0
für Zeilen und1
für Spalten).So löschen Sie die Spalte, ohne sie neu
df
zuweisen zu müssen:Schließlich wird durch Spalte fallen Nummer statt durch Spalte Label , versuchen Sie diese zu löschen, die erste zum Beispiel, 2. und 4. Spalten:
Arbeiten auch mit "Text" -Syntax für die Spalten:
quelle
del
aus irgendeinem Grund empfohlen ?drop
overdel
ist,drop
dass Sie mehrere Spalten gleichzeitig löschen, die Operation an Ort und Stelle ausführen können oder nicht, und auch Datensätze entlang einer beliebigen Achse löschen können (besonders nützlich für eine 3-D-Matrix oderPanel
)drop
overdel
ist, dass drop Teil der Pandas-API ist und Dokumentation enthält.Verwenden:
Dadurch werden eine oder mehrere Spalten an Ort und Stelle gelöscht. Beachten Sie, dass dies
inplace=True
in pandas v0.13 hinzugefügt wurde und bei älteren Versionen nicht funktioniert. In diesem Fall müssten Sie das Ergebnis zurückweisen:quelle
df.drop(list,inplace=True,axis=1)
del
- kann mehr als eine Spalte gleichzeitig löschen .Drop by Index
Erste, zweite und vierte Spalte löschen:
Erste Spalte löschen:
Es gibt einen optionalen Parameter
inplace
, mit dem die Originaldaten geändert werden können, ohne eine Kopie zu erstellen.Knallte
Spaltenauswahl, Hinzufügung, Löschung
Spalte löschen
column-name
:Beispiele:
print df
::df.drop(df.columns[[0]], axis=1, inplace=True)
print df
::three = df.pop('three')
print df
::quelle
df.T.pop('A')
df
. Sie könnten tun,df = df.T; df.pop(index); df = df.T
aber das scheint übertrieben.df.drop(df.columns[[0]], axis=1, inplace=True)
es nicht genug zu verwendendf.drop([0], axis=1)
?0
,df.drop(0, axis=1)
funktioniert dies gut. Wenn Sie den Spaltennamen nicht kennen und die erste Spalte entfernen müssendf.drop(df.columns[[0]], axis=1, inplace=True)
, wählen Sie die erste Spalte nach Position aus und legen Sie sie ab.Die eigentliche Frage, die von den meisten Antworten hier übersehen wird, lautet:
Warum kann ich nicht verwenden
del df.column_name
?Zuerst müssen wir das Problem verstehen, das es erfordert, dass wir uns mit Python-Magie-Methoden befassen .
Wie Wes in seiner Antwort
del df['column']
hervorhebt, entspricht dies der Python- Magie-Methode,df.__delitem__('column')
die in Pandas implementiert ist, um die Spalte zu löschenWie im obigen Link zu Python Magic-Methoden ausgeführt :
Sie könnten argumentieren, dass dies
del df['column_name']
nicht genutzt oder gefördert werden sollte, und damitdel df.column_name
sollte und daher nicht einmal in Betracht gezogen werden sollte.Theoretisch
del df.column_name
könnte man jedoch implementieren, um mit der magischen Methode__delattr__
in Pandas zu arbeiten . Dies bringt jedoch bestimmte Probleme mit sich, Probleme, die diedel df['column_name']
Implementierung bereits hat, jedoch in geringerem Maße.Beispiel Problem
Was ist, wenn ich eine Spalte in einem Datenrahmen mit dem Namen "dtypes" oder "column" definiere?
Nehmen wir dann an, ich möchte diese Spalten löschen.
del df.dtypes
würde die__delattr__
Methode verwirren, als ob sie das Attribut "dtypes" oder die Spalte "dtypes" löschen sollte.Architekturfragen hinter diesem Problem
Pandas antwortet:
.ix
,.loc
oder verwenden.iloc
Methoden.TLDR;
Sie können dies nicht tun,
del df.column_name
da Pandas eine ziemlich wild gewachsene Architektur hat, die überdacht werden muss, damit diese Art von kognitiver Dissonanz bei ihren Benutzern nicht auftritt.Protip:
Verwenden Sie nicht df.column_name. Es mag hübsch sein, aber es verursacht kognitive Dissonanzen
Zen of Python-Zitate, die hier passen:
Es gibt mehrere Möglichkeiten, eine Spalte zu löschen.
Spalten sind manchmal Attribute, manchmal aber auch nicht.
Hat
del df.dtypes
löschen Sie die dtypes Attribut oder die dtypes Spalte?quelle
__del__
sollte fast nie wegen der prekären Umstände verwendet werden, unter denen es genannt wird; verwenden Sie es mit Vorsicht!" ist hier völlig irrelevant, wie die hier verwendete Methode ist__delattr__
.del
eingebaute gemeint, nicht die.__del__
Instanzmethode. Diedel
eingebaute kartiert auf__delattr__
und__delitem__
das ist , was ich meine Argumentation bin Gebäude auf. Vielleicht möchten Sie noch einmal lesen, was ich geschrieben habe.__
...__
wird von StackExchangeEine nette Ergänzung ist die Möglichkeit, Spalten nur dann zu löschen, wenn sie vorhanden sind . Auf diese Weise können Sie mehr Anwendungsfälle abdecken und nur die vorhandenen Spalten aus den an sie übergebenen Beschriftungen löschen:
Fügen Sie einfach Fehler hinzu = 'ignorieren' , zum Beispiel:
quelle
ab Version 0.16.1 können Sie tun
quelle
errors= 'ignore'
)df.drop(['column_1','column_2'], axis=1 , inplace=True,errors= 'ignore')
, wenn eine solche Anwendung gewünscht wird!Es ist empfehlenswert, immer die
[]
Notation zu verwenden. Ein Grund dafür ist, dass die Attributnotation (df.column_name
) für nummerierte Indizes nicht funktioniert:quelle
Pandas 0.21+ Antwort
Pandas Version 0.21 hat die geänderte
drop
Methode leicht beide enthalten dieindex
undcolumns
Parameter , die die Unterschrift des anzupassenrename
undreindex
Methoden.Persönlich bevorzuge ich die Verwendung des
axis
Parameters zur Bezeichnung von Spalten oder Indizes, da dies der vorherrschende Schlüsselwortparameter ist, der in fast allen Pandas-Methoden verwendet wird. Jetzt haben Sie in Version 0.21 einige zusätzliche Optionen.quelle
In Pandas 0.16.1+ können Sie Spalten nur löschen, wenn sie gemäß der von @eiTanLaVi veröffentlichten Lösung vorhanden sind. Vor dieser Version können Sie dasselbe Ergebnis über ein bedingtes Listenverständnis erzielen:
quelle
TL; DR
Viel Aufwand, um eine geringfügig effizientere Lösung zu finden. Es ist schwierig, die zusätzliche Komplexität zu rechtfertigen, während die Einfachheit von geopfert wird
df.drop(dlst, 1, errors='ignore')
Präambel
Löschen einer Spalte entspricht semantisch dem Auswählen der anderen Spalten. Ich werde einige zusätzliche Methoden zeigen, die zu berücksichtigen sind.
Ich werde mich auch auf die allgemeine Lösung konzentrieren, mehrere Spalten gleichzeitig zu löschen und den Versuch zu ermöglichen, nicht vorhandene Spalten zu löschen.
Die Verwendung dieser Lösungen ist allgemein und funktioniert auch für den einfachen Fall.
Setup
Betrachten Sie die
pd.DataFrame
df
zu löschende Listedlst
Das Ergebnis sollte folgendermaßen aussehen:
Da ich das Löschen einer Spalte mit der Auswahl der anderen Spalten gleichsetze, werde ich sie in zwei Typen unterteilen:
Etikettenauswahl
Wir beginnen mit der Erstellung der Liste / des Arrays von Beschriftungen, die die Spalten darstellen, die wir behalten möchten, und ohne die Spalten, die wir löschen möchten.
df.columns.difference(dlst)
np.setdiff1d(df.columns.values, dlst)
df.columns.drop(dlst, errors='ignore')
list(set(df.columns.values.tolist()).difference(dlst))
[x for x in df.columns.values.tolist() if x not in dlst]
Spalten aus Beschriftungen
Um den Auswahlprozess zu vergleichen, nehmen Sie an:
Dann können wir auswerten
df.loc[:, cols]
df[cols]
df.reindex(columns=cols)
df.reindex_axis(cols, 1)
Welche alle bewerten zu:
Boolesche Scheibe
Wir können ein Array / eine Liste von Booleschen Werten zum Schneiden erstellen
~df.columns.isin(dlst)
~np.in1d(df.columns.values, dlst)
[x not in dlst for x in df.columns.values.tolist()]
(df.columns.values[:, None] != dlst).all(1)
Spalten aus Boolean
Zum Vergleich
df.loc[: bools]
Welche alle bewerten zu:
Robustes Timing
Funktionen
Testen
Dies ist relativ zu der Zeit, die zum Ausführen benötigt wird
df.drop(dlst, 1, errors='ignore')
. Nach all diesen Anstrengungen scheinen wir die Leistung nur geringfügig zu verbessern.In der Tat verwenden die besten Lösungen
reindex
oderreindex_axis
auf dem Hacklist(set(df.columns.values.tolist()).difference(dlst))
. Eine knappe Sekunde und immer noch geringfügig besser als siedrop
istnp.setdiff1d
.quelle
Die Punktsyntax funktioniert in JavaScript, jedoch nicht in Python.
del df['column_name']
del df['column_name']
oderdel df.column_name
quelle
Wenn Ihr ursprünglicher Datenrahmen
df
nicht zu groß ist, Sie keine Speicherbeschränkungen haben und nur wenige Spalten beibehalten müssen, können Sie auch einen neuen Datenrahmen mit nur den Spalten erstellen, die Sie benötigen:quelle
Wir können entfernen oder löschen eine bestimmte Spalte oder sprcified Spalten von Tropfen () Methode.
Angenommen, df ist ein Datenrahmen.
Zu entfernende Spalte = column0
So entfernen Sie mehrere Spalten col1, col2 ,. . . , coln, müssen wir alle Spalten, die entfernt werden mussten, in eine Liste einfügen. Entfernen Sie sie dann mit der drop () -Methode.
Ich hoffe es wäre hilfreich.
quelle
df = df.drop([col1, col2, . . . , coln], axis=1)
Dies funktioniert nicht, wenn ich einen Variablennamen anstelle von Spalte1, Spalte2 usw. anmelde. Ich erhalte eine Fehlerspalte, die nicht in der Achse liegt, wenn sie definitiv vorhanden ist. @Littin Könnten Sie helfen?Eine andere Möglichkeit, eine Spalte in Pandas DataFrame zu löschen
Wenn Sie nicht nach einer direkten Löschung suchen, können Sie einen neuen DataFrame erstellen, indem Sie die Spalten mit der
DataFrame(...)
Funktion als angebenErstellen Sie einen neuen DataFrame als
Sie erhalten ein Ergebnis, das so gut ist wie das, was Sie mit del / drop erhalten
quelle