13

Использование списка значений для выбора строк из DataFrame в Pandas

12

У меня есть следующий DataFrame в Pandas:

df = DataFrame({'A': [5,6,3,4], 'B': [1,2,3,5])
df

     A   B
0    5   1
1    6   2
2    3   3
3    4   5

Я могу отобрать строки на основе конкретного значения:

x = df[df['A'] == 3]
x

     A   B
2    3   3

Но как мне выбрать строки на основе списка значений? Что-то вроде этого:

list_of_values = [3, 6]

y = df[df['A'] in list_of_values]

В результате мне нужно получить:

     A   B
1    6   2
2    3   3

Как правильно реализовать этот фильтр в Pandas?

4 ответ(ов)

0

Невозможное решение без использования pandas, которое может сравниться по скорости:

filtered_column = set(df.A) - set(list_list_of_values)

Этот подход использует множества (set) для эффективного сравнения значений. В отличие от pandas, работа с множествами позволяет быстро выполнять операции "разности", что может значительно ускорить процесс фильтрации данных, особенно если объем данных велик. Однако, имейте в виду, что такой метод не позволит работать с DataFrame напрямую, и вам, возможно, придется преобразовать результаты в нужный вам формат.

0

Вы можете сохранить ваши значения в списке следующим образом:

lis = [3, 6]

Затем вы можете отфильтровать DataFrame df, используя метод isin:

df1 = df[df['A'].isin(lis)]

Этот код создаст новый DataFrame df1, содержащий только те строки из df, в которых значения в столбце 'A' находятся в списке lis.

0

В данном случае использование f-строк в методе query может привести к неожиданным результатам, так как query не поддерживает интерполяцию строк непосредственно внутри выражений. Вместо этого, вы можете воспользоваться методом join для формирования строки корректного запроса. Например:

list_of_values = [3, 6]
query_string = 'A in ({})'.format(', '.join(map(str, list_of_values)))
df.query(query_string)

В этом коде мы сначала преобразовали значения списка в строки, затем объединили их с помощью join и наконец вставили в строку запроса. Это обеспечит корректную работу метода query с f-строками.

0

Ответы выше верны, но если у вас всё ещё не получается отфильтровать строки, убедитесь, что у столбцов обоих DataFrame одинаковый dtype.

source = source.astype({1: 'int64'})
to_rem = to_rem.astype({'some col': 'int64'})

works = source[~source[1].isin(to_rem['some col'])]

На это у меня ушло много времени.

Чтобы ответить на вопрос, пожалуйста, войдите или зарегистрируйтесь