В PANDAS, как получить индекс известного значения?

Если у нас есть известное значение в столбце, как мы можем получить его индекс-значение? Например:

In [148]: a = pd.DataFrame(np.arange(10).reshape(5,2),columns=['c1','c2'])
In [149]: a
Out[149]:   
   c1  c2
0   0   1
1   2   3
2   4   5
........

Как известно, мы можем получить значение по соответствующему ему индексу.

In [151]: a.ix[0,1]    In [152]: a.c2[0]   In [154]: a.c2.ix[0]   <--  use index
Out[151]: 1            Out[152]: 1         Out[154]: 1            <--  get value

Но как получить индекс по значению?

Ответ 1

Для вашего значения может быть более одной карты индекса, имеет смысл возвращать список:

In [48]: a
Out[48]: 
   c1  c2
0   0   1
1   2   3
2   4   5
3   6   7
4   8   9

In [49]: a.c1[a.c1 == 8].index.tolist()
Out[49]: [4]

Ответ 2

Другой способ использования numpy.where():

import numpy as np
import pandas as pd

In [800]: df = pd.DataFrame(np.arange(10).reshape(5,2),columns=['c1','c2'])

In [801]: df
Out[801]: 
   c1  c2
0   0   1
1   2   3
2   4   5
3   6   7
4   8   9

In [802]: np.where(df["c1"]==6)
Out[802]: (array([3]),)

In [803]: indices = list(np.where(df["c1"]==6)[0])

In [804]: df.iloc[indices]
Out[804]: 
   c1  c2
3   6   7

In [805]: df.iloc[indices].index
Out[805]: Int64Index([3], dtype='int64')

In [806]: df.iloc[indices].index.tolist()
Out[806]: [3]

Ответ 3

Использование .loc [] accessor:

In [25]: a.loc[a['c1'] == 8].index[0]
Out[25]: 4

Можно также использовать get_loc(), установив 'c1' в качестве индекса. Это не изменит исходный фрейм данных.

In [17]: a.set_index('c1').index.get_loc(8)
Out[17]: 4

Ответ 4

Чтобы получить индекс по значению, просто добавьте .index [0] в конец запроса. Это вернет индекс первой строки результата...

Итак, применительно к вашему фреймворку данных:

In [1]: a[a['c2'] == 1].index[0]     In [2]: a[a['c1'] > 7].index[0]   
Out[1]: 0                            Out[2]: 4                         

Если запрос возвращает более одной строки, дополнительные результаты индекса можно получить, указав желаемый индекс, например. .index [п]

In [3]: a[a['c2'] >= 7].index[1]     In [4]: a[(a['c2'] > 1) & (a['c1'] < 8)].index[2]  
Out[3]: 4                            Out[4]: 3