Согласно документации where
возвращает не rows
и cols
а ndarray
Создадим простой датафрейм
>>> d = {'col1': [1, 2], 'col2': [3, 4]}
>>> df = pd.DataFrame(data=d)
>>> print(df)
col1 col2
0 1 3
1 2 4
А теперь попробуем найти 1 в нашем датафрейме.
>>> np.where(df == 1, df, -1)
Первым аргументом передаем условие, вторым сам датафрейм, а третьим то чем следует заполнить данные которые не будут совпадать с данным условием, например -1
Таким образом в качестве результата получаем массив:
array([[ 1, -1],
[-1, -1]])
Если вместо -1
будем использовать 0
получим:
array([[1, 0],
[0, 0]])
Теперь как мы можем получить все таки колонку и строку — отбрасыванием
>>> df.where(df == 1).dropna(how='all') # отбрасываем строки
А тут мы отбрасываем и строки и колонки
>>> res = df.where(df == 1).dropna(how='all').dropna(axis=1)
В итоге получается такой результат
col1
0 1.0
Получить строку мы можем таким образом
>>> res.index
Int64Index([0], dtype='int64')
Получить колонку таким образом
>>> res.columns
Index(['col1'], dtype='object')
Но это может быть не совсем удобно, что если нам нужны tuples в виде (row, col)?
Тогда мы можем сгенерировать их массив таким образом:
[(df[col][df[col]==1].index[i], df.columns.get_loc(col))
for col in df.columns
for i in range(len(df[col][df[col]==1].index))]
[(0, 0)] # массив туплов (row, col)
Вместо выражения df[col]==1
можно использовать функциональный эквивалент df[col].eq(1)
— дело вкуса.