Obtenir l'index des colonnes à partir du nom de colonne dans les pandas python

220

Dans R lorsque vous devez récupérer un index de colonne en fonction du nom de la colonne que vous pourriez faire

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

Existe-t-il un moyen de faire de même avec les cadres de données pandas?

ak3nat0n
la source

Réponses:

360

Bien sûr, vous pouvez utiliser .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

bien que pour être honnête, je n'en ai pas souvent besoin moi-même. Habituellement, l'accès par nom fait ce que je veux ( df["pear"], df[["apple", "orange"]]ou peut-être df.columns.isin(["orange", "pear"])), bien que je puisse certainement voir des cas où vous voudriez le numéro d'index.

DSM
la source
7
Le numéro de colonne est utile lorsque vous utilisez l' .ilocopérateur, où vous ne devez transmettre que des entiers pour les lignes et les colonnes.
abe
4
Ou lorsque vous utilisez des bibliothèques qui veulent que le DF soit converti en un tableau numpy et des index de colonnes avec des fonctionnalités particulières. Par exemple, CatBoost veut une liste d'indices de caractéristiques catégorielles.
Tom Walker
1
J'en avais besoin lors de l'ajout d'une mise en forme conditionnelle après avoir créé des feuilles de calcul avec ExcelWriter. Je dois faire référence aux colonnes (et cellules) par leurs coordonnées Excel.
Alejandro
Je l'utilise lors de la création d'un tableau de sous-parcelles. Un sous-tracé à partir des données de chaque colonne.
David Collins
2
Je l'utilise quand je veux insertune nouvelle colonne après une colonne existante.
Amir A. Shabani
33

Voici une solution grâce à la compréhension des listes. cols est la liste des colonnes pour lesquelles obtenir l'index:

[df.columns.get_loc(c) for c in cols if c in df]
snovik
la source
4
Puisqu'il colsa moins d'éléments que df.columns, faire for c in cols if c in dfserait plus rapide.
Eric O Lebigot
15

La solution de DSM fonctionne, mais si vous vouliez un équivalent direct, whichvous pourriez le faire(df.columns == name).nonzero()

Wes McKinney
la source
10

Lorsque vous cherchez à trouver plusieurs correspondances de colonnes, une solution vectorisée utilisant une searchsortedméthode peut être utilisée. Ainsi, avec dfcomme cadre de données et query_colscomme noms de colonnes à rechercher, une implémentation serait -

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

Exemple d'exécution -

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
la source
8

Si vous souhaitez que le nom de la colonne de l'emplacement de la colonne (l'inverse de la question OP), vous pouvez utiliser:

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

Utilisation de l'exemple @DSM:

>>> 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'

D'autres moyens:

df.iloc[:,1].name

df.columns[location] #(thanks to @roobie-nuby for pointing that out in comments.) 
salhin
la source
2
Pourquoi pas juste df.columns[location]?
Roobie Nuby
1

que dis-tu de ça:

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.
la source