Tenho 2 conjuntos de dados:
O primeiro descreve o que espero:
expected = {
"name": ["start", "stop", "start", "stop", "start", "stop", "start", "stop"],
"description": ["a", "b", "c", "d", "e", "f", "g", "h"],
}
e o segundo descreve o que observo:
observed = {
"name": ["start", "stop", "start", "stop", "stop", "stop", "start"],
"time": [0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7],
}
Quero combinar todas as minhas observações com descrições baseadas na ordem que espero. Mas, uma vez que vejo uma inconsistência, nada mais deve combinar.
Consegui encontrar a primeira inconsistência como:
observed_df = pl.DataFrame(observed).with_row_index()
expected_df = pl.DataFrame(expected).with_row_index()
result = observed_df.join(expected_df, on=["index", "name"], how="left").select(
"description", "time"
)
"""
┌─────────────┬──────┐
│ description ┆ time │
│ --- ┆ --- │
│ str ┆ f64 │
╞═════════════╪══════╡
│ a ┆ 0.1 │
│ b ┆ 0.2 │
│ c ┆ 0.3 │
│ d ┆ 0.4 │
│ null ┆ 0.5 │ -> First inconsistency gets a "null" description
│ f ┆ 0.6 │
│ g ┆ 0.7 │
└─────────────┴──────┘
"""
Como posso propagar isso null
após a primeira inconsistência?
Além disso, meus dados reais têm uma id
coluna adicional, onde cada um id
é um caso como descrito acima, e independente de outros id
s. É possível de alguma forma "agrupar por id" e aplicar essa lógica de uma só vez em vez de trabalhar com cada um id
separadamente:
observed = {
"id": [1, 2, 1, 2, 2],
"name": ["start", "start", "stop", "stop", "stop"],
"time": [0.1, 0.2, 0.3, 0.4, 0.5],
}
expected = {
"id": [1, 1, 2, 2],
"name": ["start", "stop", "start", "stop"],
"description": ["a", "b", "c", "d"],
}
result = {
"id": [1, 2, 1, 2, 2],
"description": ["a", "c", "b", "d", None],
"time": [0.1, 0.2, 0.3, 0.4, 0.5],
}
A verificação se algum valor nulo apareceu em uma janela crescente pode ser feita usando uma avaliação cumulativa, como
pl.Expr.cum_sum
.Uma construção when-then-otherwise pode ser usada para propagar valores nulos adequadamente.
No seu exemplo, isso pode ser parecido com o seguinte.
Se você quiser avaliar esta expressão separadamente para cada grupo definido por
id
, uma função de janela, comopl.Expr.over
, pode ser usada.