Получить индекс столбца из имени столбца в Python Pandas

220

В R, когда вам нужно получить индекс столбца на основе имени столбца, вы можете сделать

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

Есть ли способ сделать то же самое с панелями данных?

ak3nat0n
источник

Ответы:

360

Конечно, вы можете использовать .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

хотя, если честно, мне это часто не нужно. Обычно доступ по имени делает то , что я хочу его ( df["pear"], df[["apple", "orange"]]или , может быть df.columns.isin(["orange", "pear"])), хотя я могу определенно видеть случаи , когда вы хотите , индексный номер.

DSM
источник
7
Номер столбца полезен при использовании .ilocоператора, где вы должны передавать только целые числа как для строк, так и для столбцов.
Эйб
4
Или при использовании библиотек, которые хотят, чтобы DF преобразовывался в простой массив и индексы столбцов с определенными функциями. Например, CatBoost хочет список индексов категориальных функций.
Том Уокер,
1
Мне это нужно было при добавлении условного форматирования после создания таблиц в ExcelWriter. Мне нужно сослаться на столбцы (и ячейки) по их координатам Excel.
Алехандро
Я использую это при создании массива подзаговоров. Один субплот из данных в каждом столбце.
Дэвид Коллинз
2
Я использую его, когда я хочу insertновый столбец после существующего столбца.
Амир А. Шабани
33

Вот решение через понимание списка. cols - список столбцов, для которых нужно получить индекс:

[df.columns.get_loc(c) for c in cols if c in df]
Snovik
источник
4
Так как colsимеет меньше элементов, чем df.columnsделать, for c in cols if c in dfэто будет быстрее.
Эрик О Лебиго
15

Решение DSM работает, но если вы хотите получить прямой эквивалент, whichвы можете сделать(df.columns == name).nonzero()

Уэс МакКинни
источник
10

Если вы хотите найти совпадения нескольких столбцов, можно использовать searchsortedметод векторизованного решения . Таким образом, при использовании dfв качестве информационного кадра и query_colsимен столбцов для поиска реализация будет

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

Пробный прогон -

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
источник
8

Если вам нужно имя столбца из местоположения столбца (наоборот, к вопросу OP), вы можете использовать:

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

Используя пример @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'

Другие способы:

df.iloc[:,1].name

df.columns[location] #(thanks to @roobie-nuby for pointing that out in comments.) 
salhin
источник
2
Почему не просто df.columns[location]?
Руби Нуби
1

как насчет этого:

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]
Сирадж С.
источник