Использование списка значений для выбора строк из DataFrame в Pandas
У меня есть следующий 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 ответ(ов)
Невозможное решение без использования pandas, которое может сравниться по скорости:
filtered_column = set(df.A) - set(list_list_of_values)
Этот подход использует множества (set) для эффективного сравнения значений. В отличие от pandas, работа с множествами позволяет быстро выполнять операции "разности", что может значительно ускорить процесс фильтрации данных, особенно если объем данных велик. Однако, имейте в виду, что такой метод не позволит работать с DataFrame напрямую, и вам, возможно, придется преобразовать результаты в нужный вам формат.
Вы можете сохранить ваши значения в списке следующим образом:
lis = [3, 6]
Затем вы можете отфильтровать DataFrame df
, используя метод isin
:
df1 = df[df['A'].isin(lis)]
Этот код создаст новый DataFrame df1
, содержащий только те строки из df
, в которых значения в столбце 'A' находятся в списке lis
.
В данном случае использование 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-строками.
Ответы выше верны, но если у вас всё ещё не получается отфильтровать строки, убедитесь, что у столбцов обоих DataFrame одинаковый dtype
.
source = source.astype({1: 'int64'})
to_rem = to_rem.astype({'some col': 'int64'})
works = source[~source[1].isin(to_rem['some col'])]
На это у меня ушло много времени.
Переименование названий столбцов в Pandas
"Красивая печать всей Series / DataFrame в Pandas"
Запись DataFrame pandas в CSV файл
Преобразование списка словарей в DataFrame pandas
Объединение двух столбцов текста в DataFrame pandas