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?

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.


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]

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()


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])

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.) 

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]
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.