Tenho pl.DataFrame
uma coluna que compreende listas com inteiros. Preciso afirmar que cada inteiro consecutivo está aparecendo duas vezes em uma fileira no máximo.
Por exemplo, uma lista contendo [1,1,0,-1,1]
estaria OK, já que o número 1 aparece no máximo duas vezes seguidas (os dois primeiros elementos, seguidos por um zero).
Esta lista deve levar a uma afirmação falha: [1,1,1,0,-1]
o número 1
aparece três vezes seguidas.
Aqui está um exemplo de brinquedo, onde isso row2
deve levar a uma afirmação falha.
import polars as pl
row1 = [0, 1, -1, -1, 1, 1, -1, 0]
row2 = [1, -1, -1, -1, 0, 0, 1, -1]
df = pl.DataFrame({"list": [row1, row2]})
print(f"row1: {row1}")
print(f"row2: {row2}")
print(df)
row1: [0, 1, -1, -1, 1, 1, -1, 0]
row2: [1, -1, -1, -1, 0, 0, 1, -1]
shape: (2, 1)
┌───────────────┐
│ list │
│ --- │
│ list[i64] │
╞═══════════════╡
│ [0, 1, … 0] │
│ [1, -1, … -1] │
└───────────────┘
O seguinte poderia ser usado.
Execute a codificação de comprimento de execução da lista usando
pl.Expr.rle
. Isso produz uma lista de structs. Cada struct contém um valor de lista (único) e o comprimento de execução correspondente.Verifique se o comprimento máximo de execução na lista é no máximo 2.
Certifique-se de que o resultado seja do tipo
bool
selecionando o primeiro (e único) elemento na lista resultante (usandopl.Expr.list.first
).Fazer tudo isso em um
pl.Expr.list.eval
pode ser evitado explodindo a lista. Então, uma função de janela (pl.Expr.over
) é necessária para garantir que o máximo seja computado separadamente para cada lista.O resultado será o mesmo.
Você certamente precisa de um método para verificar os números consecutivamente e filtrar o Dataframe a partir daí.
Algo como:
Isso iterará pela lista e verificará se um determinado caractere se repete mais de 2 vezes; se sim, retornará Falso.
A partir daí você pode decidir o que fazer com a lista que falhou.
Você também pode encontrar outras soluções aqui .
Usando
map_elements
com um gerador e curto-circuito:Saída: