У меня есть набор данных pandas с именем tf
, в котором есть столбец с разделенными пробелами ключевыми словами под названием "Ключевые слова":
Name ... Keywords
0 Jonas 0 ... Archie Betty
1 Jonas 1 ... Archie
2 Jonas 2 ... Chris Betty Archie
3 Jonas 3 ... Betty Chris
4 Jonas 4 ... Daisy
5 Jonas 5 ... NaN
6 Jonas 5 ... Chris Archie
В качестве входных данных я хочу предоставить набор строк для фильтрации строкпо этим ключевым словам.Я думал об использовании списка:
list = ["Chris", "Betty"]
Я обнаружил, что могу отфильтровать строки, если я сделаю список строк с записями, разделенными "|":
t="|".join(list)
и ищите совпадения в этом столбце с помощью:
tf[tf["Keywords"].str.contains(t, na=False)]
Это фильтрует, находя ЛЮБОЕ совпадающее содержимое, поэтому вывод:
Name ... Keywords
0 Jonas 0 ... Archie Betty
2 Jonas 2 ... Chris Betty Archie
3 Jonas 3 ... Betty Chris
6 Jonas 5 ... Chris Archie
Вместо этого я хочу:
фильтрация, содержащая ТОЛЬКО элементы списка, и
фильтрация, содержащая AT LEASTзаписи списка
Для 1. результат должен быть
3 Jonas 3 ... Betty Chris
Для 2. результат должен быть:
2 Jonas 2 ... Chris Betty Archie
3 Jonas 3 ... Betty Chris
Я обнаружил, что следующее в основном помогло 2.
a = tf["Keywords"].str.contains("Chris")
b = tf["Keywords"].str.contains("Betty")
tf[a&b]
Однако мне нужно сделать это универсальным, поскольку длина списка и его записи могут различаться.У меня была неуклюжая идея с циклом пересечения каждых двух последовательных записей в списке, но это не сработало:
i = 0
while i < len(list)-1:
a = tf["Keywords"].str.contains(list[i])
b = tf["Keywords"].str.contains(list[i+1])
tf = a & b
i += 1
Я ценю вашу помощь.