Eu tenho um df como este:
frame = pd.DataFrame({'a' : ['a,b,c', 'a,c,f', 'b,d,f','a,z,c']})
E uma lista de itens:
letters = ['a','c']
Meu objetivo é obter todas as linhas frame
que contenham pelo menos os 2 elementos emletters
Eu vim com esta solução:
for i in letters:
subframe = frame[frame['a'].str.contains(i)]
Isso me dá o que eu quero, mas pode não ser a melhor solução em termos de escalabilidade. Existe alguma solução "vetorizada"? obrigado
Respostas:
Eu criaria uma lista de séries e aplicaria uma vetorizada
np.all
:Dá como esperado:
fonte
Uma maneira é dividir os valores da coluna em listas usando
str.split
e verifique seset(letters)
é umasubset
das listas obtidas:Referência:
fonte
TypeError: unhashable type: 'set'
quando executo seu código? funcionou no quadro fornecido1.0.3
e python é3.7
provavelmente apenas euVocê pode usar
np.intersect1d
:fonte
Isso também resolve:
fonte
Use set.issubset :
fonte
IIUC
explode
e um filtro booleanoa ideia é criar uma única série. Podemos agrupar pelo índice a contagem das ocorrências reais da sua lista usando uma soma acumulada
fonte
resultado:
timeit
resultado
fonte