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?

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.


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]

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


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

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

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]
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.