Ответ 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]
Если у нас есть известное значение в столбце, как мы можем получить его индекс-значение? Например:
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
Но как получить индекс по значению?
Для вашего значения может быть более одной карты индекса, имеет смысл возвращать список:
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]
Другой способ использования 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]
Использование .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
Чтобы получить индекс по значению, просто добавьте .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