Numpy Where передать строку как переменную

Рейтинг: 0Ответов: 1Опубликовано: 21.03.2023

Ищу в Pandas DataFrame координаты ячейки содержащей нужный мне текст. Для этого использую Numpy where.

rows, cols = np.where(df == 'Нужный мне текст')

Когда пытаюсь сравнивать с переменной содержащей текст, то ничего не находит:

text_to_find='Нужный мне текст'
rows, cols = np.where(df == text_to_find)

Подскажите пожалуйста, как в Numpy Where искать текст, содержащийся в переменной.

Ответы

▲ 1

Согласно документации 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) — дело вкуса.