Ich habe Daten in verschiedenen Spalten, weiß aber nicht, wie ich sie extrahieren soll, um sie in einer anderen Variablen zu speichern.
index a b c
1 2 3 4
2 3 4 5
Wie wähle ich 'a'
, 'b'
und es um df1 retten?
Ich habe es versucht
df1 = df['a':'b']
df1 = df.ix[:, 'a':'b']
Keiner scheint zu funktionieren.
.ix
da es mehrdeutig ist. Verwenden Sie.iloc
oder.loc
wenn Sie müssen.> csvtable_imp_1 <- csvtable_imp[0:6]
und es wählt den Delta-Betrag der ersten Spalten zwischen 0 und 6 aus. Alles, was ich tun musste, war, die CSV-Tabelle so zu lesen, wie sie durch die readr lib begrenzt ist.infile_1 = largefile_stay.ix[:,0:6]
ix
ist jetzt veraltet. Pandas empfiehlt entweder:loc
(Label-basierte Indizierung) oderiloc
(Positions-basierte Indizierung).Antworten:
Die Spaltennamen (die Zeichenfolgen sind) können nicht auf die von Ihnen versuchte Weise in Scheiben geschnitten werden.
Hier haben Sie einige Möglichkeiten. Wenn Sie aus dem Kontext wissen, welche Variablen Sie herausschneiden möchten, können Sie nur eine Ansicht dieser Spalten zurückgeben, indem Sie eine Liste an die
__getitem__
Syntax (die []) übergeben.Wenn es wichtig ist, sie numerisch und nicht nach ihrem Namen zu indizieren (sagen wir, Ihr Code sollte dies automatisch tun, ohne die Namen der ersten beiden Spalten zu kennen), können Sie dies stattdessen tun:
Darüber hinaus sollten Sie sich mit der Idee einer Ansicht in ein Pandas-Objekt im Vergleich zu einer Kopie dieses Objekts vertraut machen. Die erste der oben genannten Methoden gibt eine neue Kopie im Speicher des gewünschten Unterobjekts (der gewünschten Slices) zurück.
Manchmal gibt es jedoch Indizierungskonventionen in Pandas, die dies nicht tun und Ihnen stattdessen eine neue Variable geben, die sich nur auf denselben Speicherbereich bezieht wie das Unterobjekt oder Slice im ursprünglichen Objekt. Dies geschieht bei der zweiten Art der Indizierung, sodass Sie sie mit der
copy()
Funktion ändern können, um eine reguläre Kopie zu erhalten. Wenn dies geschieht, kann das Ändern des Ihrer Meinung nach geschnittenen Objekts manchmal das ursprüngliche Objekt ändern. Es ist immer gut, darauf zu achten.Zur Verwendung
iloc
müssen Sie die Spaltenpositionen (oder Indizes) kennen. Da sich die Spaltenpositionen ändern können, können Sie anstelle der hartcodierten Indizesiloc
zusammen mit derget_loc
Funktion dercolumns
Methode des Datenrahmenobjekts Spaltenindizes abrufen.Jetzt können Sie dieses Wörterbuch verwenden, um über Namen und Verwendung auf Spalten zuzugreifen
iloc
.quelle
df[['a','b']]
produziert eine Kopieix[]
wenn Sie es vorziehen , zu verwenden ,ix[]
aus irgendeinem Grund.ix
indiziert Zeilen, keine Spalten. Ich dachte, das OP wollte Spalten.ix
Akzeptiert Slice-Argumente, sodass Sie auch Spalten abrufen können. Zum Beispieldf.ix[0:2, 0:2]
wird das obere linke 2x2-Subarray genau wie bei einer NumPy-Matrix abgerufen (natürlich abhängig von Ihren Spaltennamen). Sie können die Slice-Syntax sogar für Zeichenfolgennamen der Spalten verwenden, zdf.ix[0, 'Col1':'Col5']
. Dadurch werden alle Spalten abgerufen, die zufällig zwischenCol1
undCol5
imdf.columns
Array angeordnet sind. Es ist falsch zu sagen, dassix
Zeilen indiziert werden. Das ist nur die grundlegendste Verwendung. Es unterstützt auch viel mehr Indizierung als das. Also,ix
ist ganz allgemein für diese Frage..iloc
genau wie Python-Listen die letzte Position.Ab der Version 0.11.0, Spalten kann in der Art und Weise Sie mit der versucht , in Scheiben geschnitten
.loc
Indexer:ist äquivalent zu
und gibt Spalten
C
durch zurückE
.Eine Demo zu einem zufällig generierten DataFrame:
So rufen Sie die Spalten von C nach E ab (beachten Sie, dass im Gegensatz zum Integer-Slicing 'E' in den Spalten enthalten ist):
Gleiches gilt für die Auswahl von Zeilen anhand von Beschriftungen. Holen Sie sich die Zeilen 'R6' bis 'R10' aus diesen Spalten:
.loc
Akzeptiert auch ein boolesches Array, sodass Sie die Spalten auswählen können, deren entsprechender Eintrag im Array lautetTrue
. Zum Beispieldf.columns.isin(list('BCD'))
kehrtarray([False, True, True, True, False, False], dtype=bool)
- Wahr , wenn die Spaltennamen in der Liste enthalten sind['B', 'C', 'D']
; Sonst falsch.quelle
Angenommen, Ihre Spaltennamen (
df.columns
) sind['index','a','b','c']
, dann befinden sich die gewünschten Daten in der 3. und 4. Spalte. Wenn Sie ihre Namen bei der Ausführung Ihres Skripts nicht kennen, können Sie dies tunAls EMS in weist darauf hin , seine Antwort ,
df.ix
Scheiben Spalten etwas prägnanten, aber die.columns
Slicing - Schnittstelle könnte natürlicher sein , weil es die Vanille-1-D Python Liste Indizierung / Slicing - Syntax verwendet.WARN:
'index'
ist ein schlechter Name für eineDataFrame
Spalte. Dieselbe Bezeichnung wird auch für das realedf.index
Attribut, einIndex
Array, verwendet. Ihre Spalte wird also von zurückgegeben,df['index']
und der echte DataFrame-Index wird von zurückgegebendf.index
. AnIndex
ist eine spezielle Art derSeries
Optimierung für die Suche nach den Werten seiner Elemente. Für df.index dient es zum Nachschlagen von Zeilen anhand ihrer Bezeichnung. Diesesdf.columns
Attribut ist auch einpd.Index
Array zum Nachschlagen von Spalten anhand ihrer Beschriftungen.quelle
.ix
ist nicht nur für Zeilen. Es dient zum allgemeinen Schneiden und kann zum mehrdimensionalen Schneiden verwendet werden. Es ist im Grunde nur eine Schnittstelle zu NumPys üblicher__getitem__
Syntax. Das heißt, Sie können ein Spalten-Slicing-Problem leicht in ein Zeilen-Slicing-Problem umwandeln, indem Sie einfach eine Transponierungsoperation anwendendf.T
. Ihr Beispiel verwendetcolumns[1:3]
, was ein wenig irreführend ist. Das Ergebnis voncolumns
ist aSeries
; Achten Sie darauf, es nicht nur wie ein Array zu behandeln. Außerdem sollten Sie es wahrscheinlich so ändern, dass escolumns[2:3]
mit Ihrem "3. und 4." Kommentar übereinstimmt.[2:4]
ist richtig. Dein[2:3]
ist falsch. Die Verwendung der Standard-Python-Slicing-Notation zum Generieren einer Sequenz / Serie ist IMO nicht irreführend. Aber ich mag es, wenn Sie die DataFrame-Schnittstelle umgehen, um mit auf das zugrunde liegende numpy-Array zuzugreifenix
.df.columns
und nach Beschriftung aufteilen möchten, haben Sie eine andere Slice-Semantik als wenn Sie es nach ganzzahliger Indexposition aufteilen . Ich habe es in meinem vorherigen Kommentar definitiv nicht gut erklärt.columns
es sich um eine unveränderliche Serie handelt, und der Getter wurde überschrieben, um Labels als Indizes zu verwenden. Vielen Dank, dass Sie sich die Zeit genommen haben, dies zu klären.quelle
df[['b as foo', 'c as bar']
Die Ausgabe benennt Spalteb
alsfoo
und Spaltec
als umbar
?df[['b', 'c']].rename(columns = {'b' : 'foo', 'c' : 'bar'})
Mir ist klar, dass diese Frage ziemlich alt ist, aber in der neuesten Version von Pandas gibt es eine einfache Möglichkeit, genau dies zu tun. Spaltennamen (die Zeichenfolgen sind) können nach Belieben in Scheiben geschnitten werden.
quelle
Sie können eine Liste der zu löschenden Spalten bereitstellen und den DataFrame nur mit den Spalten zurückgeben, die mithilfe der
drop()
Funktion in einem Pandas DataFrame benötigt werden .Nur sagen
würde einen DataFrame mit nur den Spalten
b
und zurückgebenc
.Die
drop
Methode ist hier dokumentiert .quelle
Mit Pandas,
mit Spaltennamen
nach iloc und bestimmten Spalten mit Indexnummer auswählen:
mit loc können Spaltennamen wie verwendet werden
quelle
Ich fand diese Methode sehr nützlich:
Weitere Details finden Sie hier
quelle
surveys_df.iloc [:, [2,5]]
dann.Ab 0.21.0 wird die Verwendung von
.loc
oder[]
mit einer Liste mit einem oder mehreren fehlenden Labels zugunsten von abgelehnt.reindex
. Die Antwort auf Ihre Frage lautet also:df1 = df.reindex(columns=['b','c'])
In früheren Versionen
.loc[list-of-labels]
würde die Verwendung funktionieren, solange mindestens einer der Schlüssel gefunden wurde (andernfalls würde a ausgelöstKeyError
). Dieses Verhalten ist veraltet und zeigt jetzt eine Warnmeldung an. Die empfohlene Alternative ist die Verwendung.reindex()
.Weitere Informationen finden Sie unter Indizieren und Auswählen von Daten
quelle
Sie können Pandas verwenden. Ich erstelle den DataFrame:
Der DataFrame:
So wählen Sie eine oder mehrere Spalten nach Namen aus:
Sie können auch verwenden:
Und du bekommst eine Kolumne
Test_2
Sie können aus diesen Zeilen auch Spalten und Zeilen auswählen
.loc()
. Dies wird als "Schneiden" bezeichnet . Beachten Sie, dass ich von SpalteTest_1
zu Spalte nehmeTest_3
Das "Slice" ist:
Und wenn Sie nur wollen
Peter
undAnn
aus SpaltenTest_1
undTest_3
:Du erhältst:
quelle
Wenn Sie ein Element nach Zeilenindex und Spaltennamen erhalten möchten, können Sie dies wie folgt tun
df['b'][0]
. Es ist so einfach wie Sie sich vorstellen können.Oder Sie können eine
df.ix[0,'b']
gemischte Verwendung von Index und Label verwenden.Hinweis: Da v0.20
ix
zugunsten vonloc
/ veraltet istiloc
.quelle
Ein anderer und einfacher Ansatz: Zeilen iterieren
mit iterows
quelle
Die verschiedenen Ansätze, die in den obigen Antworten diskutiert wurden, basieren auf der Annahme, dass entweder der Benutzer Spaltenindizes kennt, auf die er fallen oder eine Teilmenge festlegen soll, oder dass der Benutzer einen Datenrahmen unter Verwendung eines Spaltenbereichs (beispielsweise zwischen 'C': 'E') unterteilen möchte. . pandas.DataFrame.drop () ist sicherlich eine Option, um Daten basierend auf einer vom Benutzer definierten Liste von Spalten zu unterteilen (obwohl Sie vorsichtig sein müssen, dass Sie immer eine Kopie des Datenrahmens verwenden und Inplace- Parameter nicht auf True gesetzt werden sollten !!).
Eine andere Option ist die Verwendung von pandas.columns.difference () , die einen festgelegten Unterschied für Spaltennamen bewirkt und einen Indextyp eines Arrays zurückgibt, der die gewünschten Spalten enthält. Folgendes ist die Lösung:
Die Ausgabe wäre:
b c 1 3 4 2 4 5
quelle
df1 = df[df.columns.difference(columns_for_differencing)]
gibt einen neuen / kopierten Datenrahmen zurück. Sie könnendf1
Änderungen vornehmen, ohne Änderungen vorzunehmendf
. Danke übrigens. Das war genau das, was ich brauchte.Sie können auch df.pop () verwenden
Lassen Sie mich wissen, wenn dies für Sie hilfreich ist. Verwenden Sie bitte df.pop (c).
quelle
Ich habe mehrere Antworten darauf gesehen, aber mir blieb dies unklar. Wie würden Sie diese interessierenden Spalten auswählen? Die Antwort darauf lautet: Wenn Sie sie in einer Liste gesammelt haben, können Sie die Spalten einfach anhand der Liste referenzieren.
Beispiel
Ich habe das folgende Listen- / Numpy-Array
extracted_features
mit 63 Spalten. Der ursprüngliche Datensatz hat 103 Spalten, und ich möchte genau diese extrahieren, dann würde ich verwendenUnd Sie werden damit enden
Dies würden Sie häufig beim maschinellen Lernen verwenden (genauer gesagt bei der Auswahl von Funktionen). Ich würde gerne auch andere Möglichkeiten diskutieren, aber ich denke, dass dies bereits von anderen Stapelüberblumen abgedeckt wurde. Hoffe das war hilfreich!
quelle
Sie können die
pandas.DataFrame.filter
Methode verwenden, um Spalten wie folgt zu filtern oder neu anzuordnen:quelle
quelle