У меня есть df, как это:
frame = pd.DataFrame({'a' : ['a,b,c', 'a,c,f', 'b,d,f','a,z,c']})
И список предметов:
letters = ['a','c']
Моя цель - получить все строки из frame
которых содержат как минимум 2 элемента вletters
Я придумал это решение:
for i in letters:
subframe = frame[frame['a'].str.contains(i)]
Это дает мне то, что я хочу, но это может быть не лучшим решением с точки зрения масштабируемости. Есть ли «векторизованное» решение? Спасибо
Ответы:
Я бы построил список Series, а затем применил векторизацию
np.all
:Это дает, как и ожидалось:
источник
Один из способов - разделить значения столбцов на списки, используя
str.split
, и проверить,set(letters)
является ли одинsubset
из полученных списков:Ориентир:
источник
TypeError: unhashable type: 'set'
когда я запускаю твой код? запустил его на предоставленной раме aboe1.0.3
и питон,3.7
вероятно, только яВы можете использовать
np.intersect1d
:источник
Это также решает это:
источник
Используйте set.issubset :
источник
IIUC
explode
и логический фильтрИдея состоит в том, чтобы создать одну серию, после чего мы можем сгруппировать по индексу, подсчитать истинные вхождения в вашем списке, используя накопленную сумму.
источник
вывод:
timeit
вывод
источник