Auswahl mehrerer Spalten in ein pandas dataframe
Ich habe Daten in verschiedenen Spalten, aber ich weiß nicht, wie um Sie zu extrahieren, um es zu speichern in einer anderen variable.
index a b c
1 2 3 4
2 3 4 5
Wie wähle ich 'a'
, 'b'
und speichern Sie es auf df1?
Versuchte ich
df1 = df['a':'b']
df1 = df.ix[:, 'a':'b']
Keiner scheint zu arbeiten.
- Sie wollen nie zu verwenden
.ix
wie es ist mehrdeutig. Verwenden.iloc
oder.loc
wenn Sie müssen. - Gibt es eine Möglichkeit es getan werden kann, ohne Bezugnahme auf die header-Namen? wie in R, kann ich es so machen:
> csvtable_imp_1 <- csvtable_imp[0:6]
und es wählt die delta-Betrag der ersten Spalten zwischen 0 und 6. Alle die ich tun musste, ist das Lesen der csv-Tabelle als Trennzeichen mit der readr lib. - Ich habe gearbeitet, ein bisschen mehr mit ihm. Etwas gefunden, das funktionierte wie gewollt. Standardmäßig wählen Sie die Nummern der char und nicht Spalten.
infile_1 = largefile_stay.ix[:,0:6]
- Für diejenigen, stolpern auf dieser spät
ix
ist jetzt veraltet. Pandas empfiehlt die Verwendung entweder:loc
(label-based indexing) oderiloc
(positions-basierte Indizierung). - Pandas: Ersatz für .ix
Du musst angemeldet sein, um einen Kommentar abzugeben.
Die Spalte mit Namen (strings) können nicht geschnitten werden, in der Weise, die Sie versucht haben.
Hier haben Sie ein paar Optionen. Wenn Sie wissen, aus dem Kontext die Variablen, die Sie wollen, zu schneiden, können Sie nur zurück, eine Ansicht, die nur die Spalten, indem eine Liste in der
__getitem__
syntax (die []'s).Alternativ, wenn es darauf ankommt, zu indizieren Sie numerisch und nicht durch Ihren Namen (sagen dein code sollte automatisch tun, ohne zu wissen, die Namen der ersten zwei Spalten), können Sie dies tun, statt:
Darüber hinaus sollten Sie vertraut machen mit der Idee, einen Blick in ein Pandas Objekt vs. eine Kopie des Objekts. Die erste der oben genannten Methoden zurückkehren, eine neue Kopie im Arbeitsspeicher des gewünschten teilobjektes (die gewünschten slices).
Manchmal gibt es jedoch die Indizierung Konventionen Pandas, die dies nicht tun und stattdessen geben Sie eine neue variable, die nur bezieht sich auf den gleichen Speicherblock als sub-Objekt oder Scheibe in das ursprüngliche Objekt. Dies geschieht bei der zweiten Art der Indizierung, so dass Sie können es ändern, mit der
copy()
- Funktion, um eine regelmäßige kopieren. Wenn dies geschieht, ändern, was Sie denken, ist das geschnittene Objekt kann manchmal verändern Sie das ursprüngliche Objekt. Immer gut zu sein auf der Suche für diese.Verwenden
iloc
Sie müssen wissen, daß die Spalte Positionen (oder Indizes). Als Spalten-Positionen ändern können, statt hart zu codieren Indizes, die Sie verwenden könneniloc
zusammen mitget_loc
Funktioncolumns
Methode der dataframe-Objekt zum abrufen von Spalten-Indizes.Jetzt können Sie dieses Wörterbuch, um Zugriff auf die Spalten über Namen und mit
iloc
.df[['a','b']]
erzeugt eine Kopieix[]
wenn Sie lieber zu verwendenix[]
aus irgendeinem Grund.ix
Indizes der Zeilen, nicht Spalten. Ich dachte, der OP wollte Spalten.ix
akzeptiert Scheibe Argumente, so können Sie auch Spalten. Zum Beispieldf.ix[0:2, 0:2]
bekommt der oberen linken 2x2-sub-array so wie es für ein NumPy matrix (je nach Spalte die Namen natürlich). Sie können sogar verwenden Sie das slice-syntax für string-Namen der Spalten, wiedf.ix[0, 'Col1':'Col5']
. Das bringt alle Spalten, die zufällig angeordnet werden, zwischenCol1
undCol5
imdf.columns
array. Es ist falsch zu sagen, dassix
Indizes der Zeilen. Das ist einfach in seiner einfachsten zu verwenden. Es unterstützt auch viel mehr indizieren als das. Alsoix
ist perfekt allgemein für diese Frage.index_retain=c(1,3,9)
? in R würde ich nur tunmy_data_frame[,index_retain]
iloc
Indizierung Helfer, wiemy_data_frame.iloc[:, [1, 3, 9]]
in deinem Beispiel. Beachten Sie, dass Python Indizierung ist null-basiert. Allgemein, obwohl, da ein DataFrame ist in der Regel soll eine relationale Datenstruktur mit keine implizite Sortierung der Spalten, ist es manchmal sicherer, schreiben Sie einfach Ihre eigene helper-Funktionen, die sich auf die Spalten name und entfernen Sie alle müssen auf Sie zugreifen, indem Sie die position..iloc
welche exklusiv von der letzten position, genau wie Python Listen..iloc
Methode, wenn wir auswählen müssen, uma
undc
Spalte, die nicht nebeneinander? Danke.df[['a','b']]
ist die Reihenfolge der Spalten garantiert zu bewahren (ich.e a dann b)? So zum Beispieldf.loc[0, ['a','b']].to_numpy()
wäre es egal, in welcher Reihenfolge die Spalten waren.Vorausgesetzt, Ihre Spaltennamen (
df.columns
) sind['index','a','b','c']
, dann die Daten, die Sie wollen, ist in der3rd & 4th Spalten. Wenn Sie nicht wissen, Ihre Namen, wenn Ihr Skript ausgeführt wird, können Sie dies tun
Als EMS weist in seine Antwort,
df.ix
Scheiben Spalten etwas prägnanter, aber das.columns
slicing-Schnittstelle könnte natürlicher sein, denn es nutzt das Vanille 1-D python-Liste-Indizierung/slicing-syntax.WARNEN:
'index'
ist ein schlechter name für eineDataFrame
Spalte. Dieselbe Bezeichnung wird auch verwendet für die realdf.index
Attribut, eineIndex
array. Damit Ihre Spalte zurückgegeben wirddf['index']
und die Reale DataFrame index zurückdf.index
. EinIndex
ist eine Besondere Art vonSeries
optimiert für die lookup-Elemente " Werte. Für df.index es ist für das suchen nach Zeilen, die von Ihrem label. Dassdf.columns
- Attribut ist auch einpd.Index
array, um die Spalten und deren Beschriftungen..ix
ist nicht nur für Zeilen. Es ist für den Allgemeinen Zweck schneiden, und kann verwendet werden für mehrdimensionale schneiden. Es ist im Grunde nur eine Schnittstelle zu NumPy üblichen__getitem__
syntax. Das heißt, Sie können leicht umwandeln eine Spalte-slicing-problem in einer Zeile-slicing-problem nur durch die Anwendung einer Transposition operationdf.T
. Dein Beispiel verwendetcolumns[1:3]
, das ist ein wenig irreführend. Das Ergebniscolumns
ist einSeries
; vorsichtig sein, nicht nur behandeln es wie ein array. Auch, sollten Sie vielleicht ändern Sie es zucolumns[2:3]
zu passen mit Ihrer "3rd & 4." Kommentar.[2:4]
korrekt ist. Ihre[2:3]
ist falsch. Und mit standard-python slicing-notation erzeugen einer Sequenz/Reihe ist nicht irreführend, IMO. Aber ich mag deine Umgehung des DataFrame Schnittstelle zum Zugriff auf die zugrunde liegenden numpy-array mitix
.df.columns
und wollen die Scheibe label, dann hätten Sie verschiedene slice-Semantik, als wenn Sie die Scheibe integer-index-position. Ich auf jeden Fall nicht erklären, es auch in meinen vorherigen Kommentar aber.columns
ist eine unveränderliche Serie und die get-Methode wurde überschrieben, um Etiketten verwenden als Indizes. Vielen Dank für die Zeit nehmen, zu klären.Ab der version 0.11.0, Spalten werden kann in Scheiben geschnitten in der Art und Weise Sie versucht, mit dem
.loc
indexer:entspricht der
und gibt die Spalten
C
durchE
.Einer demo auf einer zufällig generierten DataFrame:
Erhalten Sie die Spalten von C bis E (beachten Sie, dass im Gegensatz zu integer-slicing, 'E' ist enthalten in den Spalten):
Gleiche funktioniert auch für das auswählen von Zeilen basierend auf den Etiketten. Holen Sie sich die Zeilen 'R6' auf 'R10' aus diesen Spalten:
.loc
auch akzeptiert einen boolean-array, so dass Sie können wählen Sie die Spalten, deren entsprechende Eintrag im array istTrue
. Zum Beispieldf.columns.isin(list('BCD'))
zurückarray([False, True, True, True, False, False], dtype=bool)
- True, wenn die Spalte name in der Liste['B', 'C', 'D']
; False, sonst.df[['b as foo', 'c as bar']
so dass die Ausgabe benennt Spalteb
alsfoo
und Spaltec
alsbar
?df[['b', 'c']].rename(columns = {'b' : 'foo', 'c' : 'bar'})
Merke ich, diese Frage ist schon ziemlich alt, aber in der neuesten version von pandas gibt es einen einfachen Weg, genau das zu tun. Spalte mit Namen (strings) kann geschnitten werden, in welcher Weise auch immer Sie möchten.
Können Sie eine Liste der Spalten, die gelöscht werden, und wieder zurück das DataFrame mit nur die benötigten Spalten mit den
drop()
Funktion auf ein Pandas DataFrame.Nur sagen
zurückkehren würde, ein DataFrame mit nur den Spalten
b
undc
.Den
drop
Methode ist dokumentiert hier.Fand ich diese Methode sehr nützlich:
Mehr details finden Sie hier
Mit pandas,
Witz Spaltennamen
mit iloc -, Spalten-index kann verwendet werden, wie
mit loc Spaltennamen können verwendet werden, wie
hoffe, es hilft !
Wenn Sie möchten, um ein element durch Zeilen-index und der Spalte name können Sie es genau so machen wie
df['b'][0]
. Es ist so einfach, wie Sie können Bild.Oder verwenden Sie
df.ix[0,'b']
ist die Benutzung von index und Labels.Hinweis: Seit v0.20
ix
verworfen wurde zugunsten vonloc
/iloc
.Werden die unterschiedlichen Ansätze diskutiert, die in obigen Reaktionen beruhen auf der Annahme, dass der Benutzer weiß, Spalte Indizes fallen oder Teilsätze auf, oder der Benutzer möchte Teilmenge ein dataframe mit einer Reihe von Spalten (z.B. zwischen 'C' : 'E'). pandas.DataFrame.drop() ist sicherlich eine option, um die Teilmenge der Daten basierend auf einer Liste der Spalten, die vom Benutzer definiert (obwohl Sie müssen vorsichtig sein, dass Sie immer mit Kopie des dataframe und inplace sollten die Parameter nicht gesetzt werden Wahr!!)
Andere Möglichkeit ist die Verwendung pandas.Spalten.Unterschied(), die nicht einen Satz Unterschied auf den Spaltennamen, und gibt einen index-array-Typ, mit gewünschten Spalten. Folgendes ist die Lösung:
Die Ausgabe wäre:
b c
1 3 4
2 4 5
df1 = df[df.columns.difference(columns_for_differencing)]
gibt eine neue/kopierte dataframe. Sie werden in der Lage sein zu änderndf1
ohne änderungdf
. Danke, btw. Das war genau das was ich brauchte.Können Sie pandas.
Ich erstelle den DataFrame:
Den DataFrame:
Wählen Sie 1 oder mehr Spalten-name:
Können Sie auch verwenden:
Und yo get Spalte
Test_2
Können Sie auch wählen Sie Spalten und Zeilen aus diesen Zeilen mit
.loc()
. Dies wird als "slicing". Beachten Sie, dass ich aus SpalteTest_1
zuTest_3
Die "Scheibe" ist:
Und wenn Sie wollen einfach nur
Peter
undAnn
von SpaltenTest_1
undTest_3
:Erhalten Sie:
Einen anderen und einfachen Ansatz : Iteration von Reihen
mit iterows
Ab 0.21.0, mit
.loc
oder[]
mit einer Liste mit einem oder mehreren fehlenden Etiketten, ist veraltet, zu Gunsten der.reindex
. Also, die Antwort auf Ihre Frage ist:df1 = df.reindex(columns=['b','c'])
In früheren Versionen, mit
.loc[list-of-labels]
funktionieren würde, solange mindestens 1 der Schlüssel gefunden wurde (sonst würde es heben einKeyError
). Dieses Verhalten ist veraltet und zeigt nun eine Warnmeldung. Die empfohlene alternative ist die Verwendung.reindex()
.Lesen Sie mehr auf Die Indizierung und Auswahl von Daten
Habe ich gesehen, dass mehrere Antworten auf, aber blieb mir unklar. Wie würden Sie wählen Sie die Spalten, die von Interesse? Die Antwort auf diese Frage ist, dass, wenn Sie Ihnen gesammelt in einer Liste können Sie nur Verweis auf die Spalten mit der Liste.
Beispiel
Habe ich die folgende Liste/numpy-array
extracted_features
Angabe 63 Spalten. Der original-Datensatz 103 Spalten, und ich möchte zu extrahieren, also genau jene, dann würde ichUnd Sie werden am Ende mit dieser
Dies etwas, das Sie verwenden würden, sehr oft in Machine Learning (genauer gesagt, in der feature-Auswahl). Ich würde gerne diskutieren, andere Möglichkeiten zu, aber ich denke, das ist bereits bedeckt durch andere stackoverflowers. Hoffe, diese habe hilfreich!
können Sie auch df.pop()
lassen Sie mich wissen, ob das hilft so für Sie , benutzen Sie bitte df.pop - (c)