527 Stimmen

Auswählen/Ausschließen von Spalten in Pandas

Ich möchte Ansichten oder DataFrames aus einem vorhandenen DataFrame basierend auf Spaltenauswahlen erstellen.

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

import numpy as np
import pandas as pd

# Erstellen eines DataFrames mit den Spalten A, B, C und D
df = pd.DataFrame(np.random.randn(100, 4), columns=list('ABCD'))

# Versuchen, ein zweites DataFrame df2 aus df mit allen Spalten außer 'B' und D zu erstellen
my_cols = set(df.columns)
my_cols.remove('B').remove('D')

# Dies gibt einen Fehler zurück ("unhashable type: set")
df2 = df[my_cols]

Was mache ich falsch? Vielleicht allgemeiner gefragt, welche Mechanismen hat Pandas, um die Auswahl und Ausschluss beliebiger Spalten aus einem DataFrame zu unterstützen?

735voto

Amrita Sawant Punkte 10323

Sie können entweder die Spalten, die Sie nicht benötigen, fallen lassen ODER die benötigten auswählen

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

# Nach Name löschen
df1 = df1.drop(['B', 'C'], axis=1)

# Wählen Sie die gewünschten aus
df1 = df[['a','d']]

241voto

IanS Punkte 14773

Es gibt eine neue Indexmethode namens difference. Es gibt die originalen Spalten zurück, wobei die als Argument übergebenen Spalten entfernt werden.

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

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

Beachten Sie, dass es sich um eine set-basierte Methode handelt. Daher können doppelte Spaltennamen zu Problemen führen, und die Reihenfolge der Spalten kann geändert werden.


Vorteil gegenüber drop: Sie erstellen keine Kopie des gesamten Dataframes, wenn Sie nur die Liste der Spalten benötigen. Zum Beispiel, um Duplikate in einem Teil der Spalten zu löschen:

# kann eine Kopie des Dataframes erstellen
subset = df.drop(['B', 'D'], axis=1).columns

# erstellt keine Kopie des Dataframes
subset = df.columns.difference(['B', 'D'])

df = df.drop_duplicates(subset=subset)

166voto

MrE Punkte 16859

Eine andere Option ohne Auslassen oder Filtern in einer Schleife:

import numpy as np
import pandas as pd

# Erstellen eines DataFrame mit den Spalten A, B, C und D
df = pd.DataFrame(np.random.randn(100, 4), columns=list('ABCD'))

# Fügen Sie die gewünschten Spalten hinzu
df[df.columns[df.columns.isin(['A', 'B'])]]

# oder einfacher Spalten einschließen:
df[['A', 'B']]

# Spalten ausschließen, die Sie nicht möchten
df[df.columns[~df.columns.isin(['C','D'])]]

# oder noch einfacher seit 0.24
# mit dem Nachteil, dass es die Spalten alphabetisch neu anordnet
df[df.columns.difference(['C', 'D'])]

90voto

piggybox Punkte 1599

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]

23voto

Frank Punkte 469

Schauen Sie sich auch die integrierte DataFrame.filter Funktion an.

Minimalistischer, aber gieriger Ansatz (ausreichend für das gegebene 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)))

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X