Auswählen mehrerer Spalten in einem Pandas-Datenrahmen

Lesezeit: 10 Minuten

Benutzer-Avatar
Benutzer1234440

Wie wähle ich Spalten aus a und b aus dfund speichern Sie sie in einem neuen Datenrahmen df1?

index  a   b   c
1      2   3   4
2      3   4   5

Erfolgloser Versuch:

df1 = df['a':'b']
df1 = df.ix[:, 'a':'b']

  • Sie möchten nie verwenden .ix da es zweideutig ist. Verwenden .iloc oder .loc wenn du musst.

    – Asklepios

    12. Juli 2017 um 17:14 Uhr


  • Gibt es eine Möglichkeit, dies zu tun, ohne auf die Header-Namen zu verweisen? wie in R kann ich es so machen: > 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 zu lesen, wie sie mit der readr lib begrenzt ist.

    – MichaelR

    19. Oktober 2018 um 0:30 Uhr

  • Ich habe ein bisschen mehr damit gearbeitet. Etwas gefunden, das wie gewünscht funktioniert. Standardmäßig wird die Anzahl der Zeichen und nicht der Spalten ausgewählt. infile_1 = largefile_stay.ix[:,0:6]

    – MichaelR

    19. Oktober 2018 um 0:43 Uhr


  • Für diejenigen, die so spät darüber stolpern, ix ist jetzt veraltet. Pandas empfiehlt die Verwendung von: loc (Label-basierte Indexierung) oder iloc (positionsbasierte Indizierung).

    – ZaydH

    4. Dezember 2018 um 16:20 Uhr

  • Pandas: Ersatz für .ix

    – Konnor

    24. März 2019 um 20:18 Uhr

Benutzer-Avatar
ely

Die Spaltennamen (bei denen es sich um Zeichenfolgen handelt) können nicht so aufgeteilt werden, wie Sie es versucht haben.

Hier haben Sie ein paar Möglichkeiten. Wenn Sie aus dem Kontext wissen, welche Variablen Sie herausschneiden möchten, können Sie einfach eine Ansicht nur dieser Spalten zurückgeben, indem Sie eine Liste an übergeben __getitem__ Syntax (das []’s).

df1 = df[['a', 'b']]

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 stattdessen Folgendes tun:

df1 = df.iloc[:, 0:2] # Remember that Python does not slice inclusive of the ending index.

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 obigen Methoden gibt eine neue Kopie des gewünschten Teilobjekts (der gewünschten Slices) im Speicher 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 Speicherblock wie das Unterobjekt oder Slice im ursprünglichen Objekt bezieht. Dies geschieht mit der zweiten Art der Indizierung, also können Sie es mit ändern .copy() Methode, um eine reguläre Kopie zu erhalten. Wenn dies passiert, kann das Ändern dessen, was Sie für das geschnittene Objekt halten, manchmal das ursprüngliche Objekt verändern. Immer gut, danach Ausschau zu halten.

df1 = df.iloc[0, 0:2].copy() # To avoid the case where changing df1 also changes df

Benutzen iloc, müssen Sie die Spaltenpositionen (oder Indizes) kennen. Da sich die Spaltenpositionen ändern können, können Sie anstelle von fest codierten Indizes verwenden iloc zusammen mit get_loc Die Funktion von columns Methode des Datenrahmenobjekts, um Spaltenindizes zu erhalten.

{df.columns.get_loc(c): c for idx, c in enumerate(df.columns)}

Jetzt können Sie dieses Wörterbuch verwenden, um über Namen und Verwendung auf Spalten zuzugreifen iloc.

  • Notiz: df[['a','b']] erstellt eine Kopie

    – Wes McKinney

    8. Juli 2012 um 17:54 Uhr

  • Ja, das war in meiner Antwort implizit enthalten. Der Teil über die Kopie war nur für den Gebrauch bestimmt ix[] wenn du vorziehen benutzen ix[] aus irgendeinem Grund.

    – Ely

    8. Juli 2012 um 18:09 Uhr

  • ix akzeptiert Slice-Argumente, sodass Sie auch Spalten erhalten können. Zum Beispiel, df.ix[0:2, 0:2] erhält das obere linke 2×2-Subarray genau wie bei einer NumPy-Matrix (natürlich abhängig von Ihren Spaltennamen). Sie können die Slice-Syntax sogar für Zeichenfolgennamen der Spalten verwenden, z df.ix[0, 'Col1':'Col5']. Dadurch werden alle Spalten angezeigt, die zufällig dazwischen angeordnet sind Col1 und Col5 in dem df.columns Reihe. Es ist falsch, das zu sagen ix indiziert Zeilen. Das ist nur die grundlegendste Verwendung. Es unterstützt auch viel mehr Indizierung als das. So, ix ist für diese Frage vollkommen allgemein.

    – Ely

    31. Oktober 2012 um 19:02 Uhr


  • @AndrewCassidy Nie wieder .ix verwenden. Wenn Sie mit ganzen Zahlen schneiden möchten, verwenden Sie .iloc die die letzte Position ausschließt, genau wie Python-Listen.

    – Ted Petrou

    1. Juli 2017 um 13:55 Uhr

  • @dte324 Wenn Ihr DataFrame benannt ist df dann benutze df.iloc[:, [1, 4]]. Wenn Sie diese Art von Zugriffsmuster wünschen, kennen Sie normalerweise diese speziellen Spaltennamen bereits und können sie einfach verwenden df.loc[:, ['name2', 'name5']] wo 'name2' und 'name5' sind Ihre Spalten-String-Namen für die jeweiligen gewünschten Spalten, oder suchen Sie die Namen mit zB name2 = df.columns[1].

    – Ely

    12. September 2019 um 12:19 Uhr


Benutzer-Avatar
ayhan

Ab Version 0.11.0 Spalten kann sein in Scheiben geschnitten, wie Sie es versucht haben .loc Indexierer:

df.loc[:, 'C':'E']

erhält die gleichen Spalten wie

df[['C', 'D', 'E']] # Mind, this makes a copy.

oder

df.loc[:, ['C', 'D', 'E']] # This does not make a copy (better).

und gibt Spalten zurück C durch E.


Eine Demo auf einem zufällig generierten DataFrame:

import pandas as pd
import numpy as np
np.random.seed(5)
df = pd.DataFrame(np.random.randint(100, size=(100, 6)),
                  columns=list('ABCDEF'),
                  index=['R{}'.format(i) for i in range(100)])
df.head()

Out:
     A   B   C   D   E   F
R0  99  78  61  16  73   8
R1  62  27  30  80   7  76
R2  15  53  80  27  44  77
R3  75  65  47  30  84  86
R4  18   9  41  62   1  82

Um die Spalten zu bekommen C zu E (Beachten Sie, dass im Gegensatz zum Integer-Slicing E ist in den Spalten enthalten):

df.loc[:, 'C':'E']

Out:
      C   D   E
R0   61  16  73
R1   30  80   7
R2   80  27  44
R3   47  30  84
R4   41  62   1
R5    5  58   0
...

Dasselbe gilt für die Auswahl von Zeilen basierend auf Beschriftungen. Holen Sie sich die Zeilen R6 zu R10 aus diesen Spalten:

df.loc['R6':'R10', 'C':'E']

Out:
      C   D   E
R6   51  27  31
R7   83  19  18
R8   11  67  65
R9   78  27  29
R10   7  16  94

.loc akzeptiert auch ein Boolesches Array, sodass Sie die Spalten auswählen können, deren entsprechender Eintrag im Array ist True. Zum Beispiel, df.columns.isin(list('BCD')) kehrt zurück array([False, True, True, True, False, False], dtype=bool) – True, wenn der Spaltenname in der Liste enthalten ist ['B', 'C', 'D']; Falsch, sonst.

df.loc[:, df.columns.isin(list('BCD'))]

Out:
      B   C   D
R0   78  61  16
R1   27  30  80
R2   53  80  27
R3   65  47  30
R4    9  41  62
R5   78   5  58
...

  • df.loc[:, ‘C’:’E’] das ist genau die antwort die ich gesucht habe. Ich habe C und E in eine andere Klammer gesetzt, das war mein Fehler. Vielen Dank

    – JQTs

    24. Juni 2021 um 20:18 Uhr


  • df.loc[] scheint dann schneller df[[]].

    – Sean.H

    15. April um 10:06 Uhr

  • @ Sean.H ja, der hoch bewertete Kommentar unter der obigen Antwort sollte Beweis genug sein. Vermeiden Sie Kopien, wenn Sie können. df.loc[] ist besser.

    – Frage an 42 steht mit der Ukraine

    8. Juli um 17:58 Uhr


Benutzer-Avatar
Kochfelder

Angenommen, Ihre Spaltennamen (df.columns) sind ['index','a','b','c'], dann befinden sich die gewünschten Daten in der dritten und vierten Spalte. Wenn Sie ihre Namen nicht kennen, wenn Ihr Skript ausgeführt wird, können Sie dies tun

newdf = df[df.columns[2:4]] # Remember, Python is zero-offset! The "third" entry is at slot two.

Wie EMS in seiner Antwort betont, df.ix schneidet Spalten etwas prägnanter, aber die .columns Die Slicing-Schnittstelle ist möglicherweise natürlicher, da sie die eindimensionale Python-Slicing-/Slicing-Syntax für Python-Listen verwendet.

Warnung: 'index' ist ein schlechter Name für a DataFrame Säule. Dasselbe Etikett wird auch für das Reale verwendet df.index Attribut, ein Index Reihe. Ihre Spalte wird also von zurückgegeben df['index'] und der echte DataFrame-Index wird von zurückgegeben df.index. Ein Index ist eine besondere Art Series optimiert für die Suche nach den Werten seiner Elemente. Für df.index dient es zum Nachschlagen von Zeilen anhand ihres Labels. Dass df.columns Attribut ist auch ein pd.Index array, um Spalten anhand ihrer Beschriftungen zu suchen.

  • Wie ich oben in meinem Kommentar bemerkt habe, .ix ist nicht nur für Zeilen. Es ist für Allzweck-Slicing und kann für multidimensionales Slicing verwendet werden. Es ist im Grunde nur eine Schnittstelle zu NumPys Üblichem __getitem__ Syntax. Allerdings können Sie ein Column-Slicing-Problem einfach in ein Row-Slicing-Problem umwandeln, indem Sie einfach eine Transponierungsoperation anwenden. df.T. Ihr Beispiel verwendet columns[1:3], was ein wenig irreführend ist. Das Ergebnis von columns ist ein Series; Achten Sie darauf, es nicht einfach wie ein Array zu behandeln. Außerdem solltest du es wohl ändern columns[2:3] um mit Ihrem “3. & 4.” Kommentar übereinzustimmen.

    – Ely

    31. Oktober 2012 um 19:11 Uhr


  • @Mr.F: Meine [2:4] ist richtig. Dein [2:3] ist falsch. Und die Verwendung der Standard-Python-Slicing-Notation zum Generieren einer Sequenz/Serie ist meiner Meinung nach nicht irreführend. Aber ich mag Ihre Umgehung der DataFrame-Schnittstelle, um auf das zugrunde liegende numpy-Array zuzugreifen ix.

    – Kochfelder

    4. Februar 2016 um 17:26 Uhr

  • Sie haben in diesem Fall Recht, aber ich wollte damit sagen, dass im Allgemeinen Das Slicen mit Labels in Pandas beinhaltet den Slice-Endpunkt (oder zumindest war dies das Verhalten in den meisten früheren Pandas-Versionen). Also, wenn Sie abrufen df.columns und will es schneiden nach Etikettdann hätten Sie eine andere Slice-Semantik als beim Slicen nach ganzzahliger Indexposition. Ich habe es in meinem vorherigen Kommentar definitiv nicht gut erklärt.

    – Ely

    4. Februar 2016 um 18:05 Uhr

  • Ahh, jetzt verstehe ich deinen Punkt. ich habe es vergessen columns ist eine unveränderliche Serie und der Getter wurde überschrieben, um Labels als Indizes zu verwenden. Vielen Dank, dass Sie sich die Zeit genommen haben, dies zu klären.

    – Kochfelder

    5. Februar 2016 um 0:17 Uhr

  • Beachten Sie die Verfallswarnung: .ix ist veraltet. Daher macht das Sinn: newdf = df[df.columns[2:4]]

    – Martien Lubberink

    1. Juli 2017 um 23:57 Uhr

Benutzer-Avatar
Nullvektor

In der neuesten Version von Pandas gibt es eine einfache Möglichkeit, genau dies zu tun. Spaltennamen (die Strings sind) kann in Scheiben geschnitten werden, wie Sie möchten.

columns = ['b', 'c']
df1 = pd.DataFrame(df, columns=columns)

In [39]: df
Out[39]: 
   index  a  b  c
0      1  2  3  4
1      2  3  4  5

In [40]: df1 = df[['b', 'c']]

In [41]: df1
Out[41]: 
   b  c
0  3  4
1  4  5

  • Was wäre, wenn ich die Spalte umbenennen wollte, zum Beispiel so etwas wie: df[['b as foo', 'c as bar'] so dass die Ausgabe die Spalte umbenennt b wie foo und Spalte c wie bar?

    – kuanb

    14. Februar 2017 um 20:30 Uhr

  • df[['b', 'c']].rename(columns = {'b' : 'foo', 'c' : 'bar'})

    – Greg

    25. August 2017 um 22:48 Uhr

  • Eine Erklärung wäre angebracht. Was ist zB das Wesentliche? Sie können Ihre Antwort bearbeiten – ohne “Edit:”, “Update:”, oder ähnliches – die Antwort sollte so aussehen, als wäre sie heute geschrieben worden.

    – Peter Mortensen

    8. Februar 2021 um 14:55 Uhr


Benutzer-Avatar
Peter Mortensen

Mit Pandas,

mit Spaltennamen

dataframe[['column1','column2']]

um nach iloc und bestimmten Spalten mit Indexnummer auszuwählen:

dataframe.iloc[:,[1,2]]

mit loc Spaltennamen können wie verwendet werden

dataframe.loc[:,['column1','column2']]

  • Was wäre, wenn ich die Spalte umbenennen wollte, zum Beispiel so etwas wie: df[['b as foo', 'c as bar'] so dass die Ausgabe die Spalte umbenennt b wie foo und Spalte c wie bar?

    – kuanb

    14. Februar 2017 um 20:30 Uhr

  • df[['b', 'c']].rename(columns = {'b' : 'foo', 'c' : 'bar'})

    – Greg

    25. August 2017 um 22:48 Uhr

  • Eine Erklärung wäre angebracht. Was ist zB das Wesentliche? Sie können Ihre Antwort bearbeiten – ohne “Edit:”, “Update:”, oder ähnliches – die Antwort sollte so aussehen, als wäre sie heute geschrieben worden.

    – Peter Mortensen

    8. Februar 2021 um 14:55 Uhr


Benutzer-Avatar
Peter Mortensen

Du kannst den … benutzen pandas.DataFrame.filter Methode, um Spalten wie folgt zu filtern oder neu anzuordnen:

df1 = df.filter(['a', 'b'])

Dies ist auch sehr nützlich, wenn Sie Methoden verketten.

  • filter ist großartig und nicht so bekannt, wie es sein sollte. Insbesondere können Sie auch Regexes wie diese verwenden: df.filter(regex='a|b'). Ich habe ein längeres Beispiel in einer Antwort auf diese Frage: stackoverflow.com/questions/29241836/…

    – JohannesE

    26. Februar 2021 um 15:48 Uhr


  • filter kann auch nicht existierende Spalten in der “items= .. list” ignorieren, was manchmal sehr hilfreich ist!

    – flipSTAR

    29. März 2021 um 14:50 Uhr

  • Dies ist die beste Antwort

    – WestCoastProjects

    13. September 2021 um 22:16 Uhr

1157770cookie-checkAuswählen mehrerer Spalten in einem Pandas-Datenrahmen

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy