Auswählen/Ausschließen von Spaltensätzen in Pandas [duplicate]

Lesezeit: 1 Minute

Benutzer-Avatar
Amelio Vázquez-Reina

Ich möchte Ansichten oder Datenrahmen aus einem vorhandenen Datenrahmen basierend auf der Spaltenauswahl erstellen.

Zum Beispiel möchte ich einen Datenrahmen erstellen df2 aus einem Datenrahmen df1 die alle Spalten enthält, außer zwei davon. Ich habe versucht, Folgendes zu tun, aber es hat nicht funktioniert:

import numpy as np
import pandas as pd

# Create a dataframe with columns A,B,C and D
df = pd.DataFrame(np.random.randn(100, 4), columns=list('ABCD'))

# Try to create a second dataframe df2 from df with all columns except 'B' and D
my_cols = set(df.columns)
my_cols.remove('B').remove('D')

# This returns an error ("unhashable type: set")
df2 = df[my_cols]

Was mache ich falsch? Vielleicht allgemeiner, welche Mechanismen haben Pandas, um das Pflücken zu unterstützen und Ausschlüsse von beliebigen Sätzen von Spalten aus einem Datenrahmen?

Benutzer-Avatar
Amrita Sawant

Sie können entweder die nicht benötigten Spalten löschen ODER die benötigten auswählen

# Using DataFrame.drop
df.drop(df.columns[[1, 2]], axis=1, inplace=True)

# drop by Name
df1 = df1.drop(['B', 'C'], axis=1)

# Select the ones you want
df1 = df[['a','d']]

  • Gibt es eine Möglichkeit, nur die auszuwählen nSpalte? dh: df1 = my_df[[n]] wo n ist die letzte Spalte von n Anzahl der Spalten, versuche ich negative Indizierung [[-1]]<- es funktioniert nicht :( Hilfe!~

    – 3kstc

    8. März 2018 um 3:26 Uhr

  • @3kstc können Sie verwenden df1.iloc[:, [-1]] Dadurch werden alle Zeilen und die letzte Spalte ausgewählt.

    – Kocur4d

    25. April 2018 um 10:16 Uhr


  • was ist mit verwenden isin für Spalten? Keine Notwendigkeit zu fallen oder zu schleifen. Siehe meine Antwort unten.

    – HerrE

    30. Juli 2018 um 20:43 Uhr

  • Sie können auch tippen df.drop(columns=['B', 'C'])

    – Levi Baguley

    23. August 2021 um 21:13 Uhr


Benutzer-Avatar
IanS

Es gibt eine neue aufgerufene Indexmethode difference. Es gibt die ursprünglichen Spalten zurück, wobei die als Argument übergebenen Spalten entfernt wurden.

Hier wird das Ergebnis verwendet, um Spalten zu entfernen B und D aus df:

df2 = df[df.columns.difference(['B', 'D'])]

Beachten Sie, dass es sich um eine satzbasierte Methode handelt, sodass doppelte Spaltennamen Probleme verursachen und die Spaltenreihenfolge möglicherweise geändert wird.


Vorteil Über drop: Sie erstellen keine Kopie des gesamten Datenrahmens, wenn Sie nur die Liste der Spalten benötigen. Um beispielsweise Duplikate in einer Teilmenge von Spalten zu löschen:

# may create a copy of the dataframe
subset = df.drop(['B', 'D'], axis=1).columns

# does not create a copy the dataframe
subset = df.columns.difference(['B', 'D'])

df = df.drop_duplicates(subset=subset)

  • Nett. Gibt es einen Vorteil/Nachteil, es auf diese Weise zu tun gegenüber df.drop(['B', 'D'], axis=1)?

    – Ben

    29. September 2016 um 21:23 Uhr


  • Der Vorteil ist für mich die Lesbarkeit des Codes. Ich finde die Verwendung von drop zur Auswahl von Spalten kontraintuitiv.

    – Ians

    30. September 2016 um 8:30 Uhr

  • difference() scheint auch Spalten standardmäßig alphabetisch neu zu ordnen

    – slizb

    1. Dezember 2016 um 22:16 Uhr

  • @slizb guter Punkt, basierend auf dem Quellcode Es sieht so aus, als gäbe es tatsächlich keine Garantie für die Reihenfolge des zurückgegebenen Indexes, da die Methode Sets verwendet.

    – Ians

    2. Dezember 2016 um 8:46 Uhr

  • Es scheint, dass die Drop-Methode etwas schneller ist (~ 515 µs gegenüber ~ 680 µs), zumindest in einigen Tests auf einem Datenrahmen mit 15611 Zeilen x 5 Spalten, von dem ich 3 Spalten löschen wollte, in Python 3.6 und Pandas 0.20.3.

    – bli

    8. November 2017 um 17:12 Uhr

Benutzer-Avatar
HerrE

Eine weitere Option, ohne in einer Schleife zu löschen oder zu filtern:

import numpy as np
import pandas as pd

# Create a dataframe with columns A,B,C and D
df = pd.DataFrame(np.random.randn(100, 4), columns=list('ABCD'))

# include the columns you want
df[df.columns[df.columns.isin(['A', 'B'])]]

# or more simply include columns:
df[['A', 'B']]

# exclude columns you don't want
df[df.columns[~df.columns.isin(['C','D'])]]

# or even simpler since 0.24
# with the caveat that it reorders columns alphabetically 
df[df.columns.difference(['C', 'D'])]

  • Nett. Ausfall von list(df.columns).remove('C') hat mich wahnsinnig gemacht.

    – PatrickT

    7. Januar um 20:17 Uhr

Sie müssen das nicht wirklich in ein Set umwandeln:

cols = [col for col in df.columns if col not in ['B', 'D']]
df2 = df[cols]

Schau auch mal ins eingebaute DataFrame.filter Funktion.

Minimalistischer, aber gieriger Ansatz (ausreichend für den gegebenen df):

df.filter(regex="[^BD]")

Konservativer/fauler Ansatz (nur exakte Übereinstimmungen):

df.filter(regex="^(?!(B|D)$).*$")

Konservativ und generisch:

exclude_cols = ['B','C']
df.filter(regex="^(?!({0})$).*$".format('|'.join(exclude_cols)))

  • Auf diese Weise ist eine Methodenverkettung möglich.

    – Eric Ness

    14. Dezember 2018 um 15:44 Uhr

  • Das ist schön, um Spalten auszuwählen, aber es scheint sehr chaotisch, sie auszuschließen!

    – PatrickT

    7. Januar um 20:07 Uhr

Benutzer-Avatar
Kapil Marwaha

Du hast 4 Spalten A,B,C,D

Hier ist eine bessere Möglichkeit, die Spalten auszuwählen, die Sie für den neuen Datenrahmen benötigen: –

df2 = df1[['A','D']]

Wenn Sie stattdessen Spaltennummern verwenden möchten, verwenden Sie: –

df2 = df1[[0,3]]

  • Auf diese Weise ist eine Methodenverkettung möglich.

    – Eric Ness

    14. Dezember 2018 um 15:44 Uhr

  • Das ist schön, um Spalten auszuwählen, aber es scheint sehr chaotisch, sie auszuschließen!

    – PatrickT

    7. Januar um 20:07 Uhr

Benutzer-Avatar
Tacaswell

Sie müssen nur Ihre umwandeln set zu einem list

import pandas as pd
df = pd.DataFrame(np.random.randn(100, 4), columns=list('ABCD'))
my_cols = set(df.columns)
my_cols.remove('B')
my_cols.remove('D')
my_cols = list(my_cols)
df2 = df[my_cols]

  • Vielen Dank! Das funktioniert einwandfrei. Ich frage mich nur, ob es Funktionen in Panda gibt, die die Spezifikation von Spalten für diese Art (oder ausgefeiltere Arten) der Spaltenfilterung erleichtern?

    – Amelio Vázquez-Reina

    18. Februar 2013 um 17:17 Uhr

  • @ user273158 Weiß nicht, ich fange gerade erst an zu lernen Pandas mich selbst.

    – tacaswell

    18. Februar 2013 um 17:20 Uhr

  • Vielleicht verwenden fallen?. df.drop(my_cols, axis=1) erzeugt eine Ansicht des DataFrame mit den gelöschten Spalten. Sie müssen es dann nur noch dem neuen DF zuweisen: df2 = df.drop(my_cols, axis=1)

    – Herrfz

    18. Februar 2013 um 18:33 Uhr


  • Verwenden [drop][1] wie in dieser Antwort auf eine andere Frage: stackoverflow.com/a/18145399/115237 [1]: pandas.pydata.org/pandas-docs/stable/generated/…

    – Noël Evans

    12. August 2014 um 11:28 Uhr


1112230cookie-checkAuswählen/Ausschließen von Spaltensätzen in Pandas [duplicate]

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

Privacy policy