Abrufen des Spaltenindex vom Spaltennamen in Python-Pandas

220

In R, wenn Sie einen Spaltenindex basierend auf dem Namen der Spalte abrufen müssen, die Sie ausführen können

idx <- which(names(my_data)==my_colum_name)

Gibt es eine Möglichkeit, dasselbe mit Pandas-Datenrahmen zu tun?

ak3nat0n
quelle

Antworten:

359

Sicher können Sie verwenden .get_loc():

In [45]: df = DataFrame({"pear": [1,2,3], "apple": [2,3,4], "orange": [3,4,5]})

In [46]: df.columns
Out[46]: Index([apple, orange, pear], dtype=object)

In [47]: df.columns.get_loc("pear")
Out[47]: 2

obwohl ich das ehrlich gesagt nicht oft selbst brauche. In der Regel Zugang namentlich das tut , was ich will es ( df["pear"], df[["apple", "orange"]], oder vielleicht df.columns.isin(["orange", "pear"])), obwohl ich auf jeden Fall Fällen sehen kann , wo Sie die Indexnummer wollen würden.

DSM
quelle
7
Die Spaltennummer ist nützlich, wenn Sie den .ilocOperator verwenden, bei dem Sie nur Ganzzahlen für Zeilen und Spalten übergeben müssen.
Ab
4
Oder wenn Sie Bibliotheken verwenden, bei denen der DF in ein Numpy-Array und Spaltenindizes mit bestimmten Funktionen konvertiert werden soll. Zum Beispiel möchte CatBoost eine Liste von Indizes kategorialer Merkmale.
Tom Walker
1
Ich brauchte dies, wenn ich nach dem Erstellen von Arbeitsblättern mit ExcelWriter eine bedingte Formatierung hinzufügte. Ich muss Spalten (und Zellen) anhand ihrer Excel-Koordinaten referenzieren.
Alejandro
Ich benutze dies, wenn ich ein Array von Nebenhandlungen mache. Ein Unterplot aus den Daten in jeder Spalte.
David Collins
2
Ich benutze es, wenn ich insertnach einer vorhandenen Spalte eine neue Spalte erstellen möchte .
Amir A. Shabani
33

Hier ist eine Lösung durch Listenverständnis. cols ist die Liste der Spalten, für die ein Index abgerufen werden soll:

[df.columns.get_loc(c) for c in cols if c in df]
snovik
quelle
4
Da colshat weniger Elemente als df.columns, for c in cols if c in dfwäre das schneller.
Eric O Lebigot
15

Die Lösung von DSM funktioniert, aber wenn Sie ein direktes Äquivalent zu whichIhnen möchten, können Sie dies tun(df.columns == name).nonzero()

Wes McKinney
quelle
10

Wenn Sie möglicherweise nach mehrspaltigen Übereinstimmungen suchen, kann eine vektorisierte Lösung mit der searchsortedMethode verwendet werden. Mit dfals Datenrahmen und query_colsals zu suchenden Spaltennamen wäre eine Implementierung also -

def column_index(df, query_cols):
    cols = df.columns.values
    sidx = np.argsort(cols)
    return sidx[np.searchsorted(cols,query_cols,sorter=sidx)]

Probelauf -

In [162]: df
Out[162]: 
   apple  banana  pear  orange  peach
0      8       3     4       4      2
1      4       4     3       0      1
2      1       2     6       8      1

In [163]: column_index(df, ['peach', 'banana', 'apple'])
Out[163]: array([4, 1, 0])
Divakar
quelle
8

Wenn Sie den Spaltennamen von der Spaltenposition (umgekehrt zur OP-Frage) möchten, können Sie Folgendes verwenden:

>>> df.columns.get_values()[location]

Verwenden von @DSM Beispiel:

>>> df = DataFrame({"pear": [1,2,3], "apple": [2,3,4], "orange": [3,4,5]})

>>> df.columns

Index(['apple', 'orange', 'pear'], dtype='object')

>>> df.columns.get_values()[1]

'orange'

Andere Möglichkeiten:

df.iloc[:,1].name

df.columns[location] #(thanks to @roobie-nuby for pointing that out in comments.) 
Salhin
quelle
2
Warum nicht einfach df.columns[location]?
Roobie Nuby
1

Wie wäre es damit:

df = DataFrame({"pear": [1,2,3], "apple": [2,3,4], "orange": [3,4,5]})
out = np.argwhere(df.columns.isin(['apple', 'orange'])).ravel()
print(out)
[1 2]
Siraj S.
quelle