Отримайте індекс стовпця від назви стовпців у пандах python


220

У R, коли вам потрібно отримати індекс стовпця, виходячи з назви стовпця, який ви могли б зробити

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

Чи можна зробити те ж саме з фреймами даних панд?

Відповіді:


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"])), хоча я точно можу бачити випадки, коли ви хочете, щоб номер індексу.


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]

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

8

Якщо ви хочете назву стовпця з розташування стовпця (навпаки до питання про ОП), ви можете використовувати:

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

2
Чому б не просто df.columns[location]?
Roobie Nuby

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]
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.