Obter índice de coluna do nome da coluna em pandas python

220

Em R, quando você precisa recuperar um índice de coluna com base no nome da coluna, você pode fazer

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

Existe uma maneira de fazer o mesmo com os quadros de dados do pandas?

ak3nat0n
fonte

Respostas:

359

Claro, você pode usar .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

embora, para ser sincero, nem sempre eu precise disso. Normalmente, o acesso pelo nome faz o que eu quero que ele ( df["pear"], df[["apple", "orange"]], ou talvez df.columns.isin(["orange", "pear"])), embora eu posso definitivamente ver casos em que você deseja que o número de índice.

DSM
fonte
7
O número da coluna é útil ao usar o .ilocoperador, onde você deve passar apenas números inteiros para as linhas e colunas.
abe
4
Ou ao usar bibliotecas que desejam que o DF seja convertido em uma matriz numpy e índices de colunas com recursos específicos. Por exemplo, o CatBoost deseja uma lista de índices de recursos categóricos.
Tom Walker
1
Eu precisava disso ao adicionar formatação condicional após criar planilhas com o ExcelWriter. Eu preciso me referir a colunas (e células) por suas coordenadas do Excel.
Alejandro
Eu uso isso ao fazer uma matriz de subparcelas. Uma subtrama dos dados em cada coluna.
David Collins
2
Eu o uso quando quero insertuma nova coluna após uma coluna existente.
Amir A. Shabani
33

Aqui está uma solução através da compreensão da lista. cols é a lista de colunas para a qual obter índice:

[df.columns.get_loc(c) for c in cols if c in df]
snovik
fonte
4
Como colstem menos elementos do que df.columns, fazer for c in cols if c in dfseria mais rápido.
Eric O Lebigot 22/09
15

A solução da DSM funciona, mas se você quiser um equivalente direto, whichpoderá fazer(df.columns == name).nonzero()

Wes McKinney
fonte
10

Quando você procura encontrar várias correspondências de coluna, uma solução vetorizada usando o searchsortedmétodo pode ser usada. Assim, com dfo nome do quadro de dados e query_colsda coluna a ser pesquisado, uma implementação seria:

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

Amostra executada -

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
fonte
8

Caso deseje o nome da coluna no local da coluna (o contrário da pergunta OP), você pode usar:

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

Usando o exemplo @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'

Outras maneiras:

df.iloc[:,1].name

df.columns[location] #(thanks to @roobie-nuby for pointing that out in comments.) 
salhin
fonte
2
Por que não apenas df.columns[location]?
Roobie Nuby 11/10/19
1

que tal agora:

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