Tenho um dataframe Polars corpus
com uma coluna de string e milhões de linhas.
Também tenho uma lista de substrings substrings
.
Posso pegar uma substring e consultar em quantas linhas essa substring aparece com:
corpus.select(pl.col('contents').str.contains(substrings[0]).sum()).item()
Isso funciona bem para uma substring, mas tenho 10.000 substrings para verificar. Qual é a maneira mais eficiente em Polars de verificar todas elas?
Considerei converter substrings
em seu próprio dataframe polars e, então, executar um inner-join na presença de substring, agrupando por palavra-chave e, então, contando o tamanho dos grupos. No entanto, isso parece muito caro de uma perspectiva de sobrecarga de RAM, e estou limitado em RAM.
Existe uma maneira melhor/mais limpa?
Abordagem lenta atual:
import polars as pl
substrings = pl.DataFrame({'substring': ['a', 'b', 'c']})
corpus = pl.DataFrame({'contents': ['aBMMmcICmY', 'ORqkIJCwjV', 'JTQHufYApo', 'SNoqiJxpMY', 'SYbEsasrzt', 'XLinDPSRld', 'iInkOGqBDU', 'vBtykwGOqN', 'ZIpOdkkXBd', 'iUokuiefBS']})
def count_occurrences(substring):
return corpus.select(pl.col('contents').str.contains(substring).sum()).item()
substrings = substrings.with_columns(pl.col('substring').map_elements(count_occurrences).alias('frequency'))
Saída:
shape: (3, 2)
┌───────────┬───────────┐
│ substring ┆ frequency │
│ --- ┆ --- │
│ str ┆ i64 │
╞═══════════╪═══════════╡
│ a ┆ 2 │
│ b ┆ 1 │
│ c ┆ 1 │
└───────────┴───────────┘