Estou tentando comparar dois dataframes via dfcompare = (df0 == df1)
e nulos nunca são considerados idênticos (ao contrário de join
não haver opção para permitir que nulos correspondam).
Minha abordagem com outros campos é preenchê-los com um "valor vazio" apropriado para seu tipo de dado. O que devo usar para structs?
import polars as pl
df = pl.DataFrame(
{
"int": [1, 2, None],
"data" : [dict(a=1,b="b"),dict(a=11,b="bb"),None]
}
)
df.describe()
print(df)
df2 = df.with_columns(pl.col("int").fill_null(0))
df2.describe()
print(df2)
# these error out:...
try:
df3 = df2.with_columns(pl.col("data").fill_null(dict(a=0,b="")))
except (Exception,) as e:
print("try#1", e)
try:
df3 = df2.with_columns(pl.col("data").fill_null(pl.struct(dict(a=0,b=""))))
except (Exception,) as e:
print("try#2", e)
Saída:
shape: (3, 2)
┌──────┬─────────────┐
│ int ┆ data │
│ --- ┆ --- │
│ i64 ┆ struct[2] │
╞══════╪═════════════╡
│ 1 ┆ {1,"b"} │
│ 2 ┆ {11,"bb"} │
│ null ┆ {null,null} │
└──────┴─────────────┘
shape: (3, 2)
┌─────┬─────────────┐
│ int ┆ data │
│ --- ┆ --- │
│ i64 ┆ struct[2] │
╞═════╪═════════════╡
│ 1 ┆ {1,"b"} │
│ 2 ┆ {11,"bb"} │
│ 0 ┆ {null,null} │
└─────┴─────────────┘
try#1 invalid literal value: "{'a': 0, 'b': ''}"
try#2 a
Error originated just after this operation:
DF ["int", "data"]; PROJECT */2 COLUMNS; SELECTION: "None"
Minha solução alternativa satisfatória foi para unnest
as colunas. Isso funciona bem (melhor ainda, pois permite preenchimentos subcampo por subcampo). Ainda assim, continuo curioso sobre como obter um "literal de struct" adequado que possa ser passado para esses tipos de funções.
Também é possível imaginar querer adicionar uma coluna codificada como emdf4 = df.with_columns(pl.lit("0").alias("zerocol"))
Comparando dataframes com valores ausentes
Há um frame-level
pl.DataFrame.equals
, que recebe um parâmetronull_equal
padrão paraTrue
. Ele pode ser usado da seguinte forma.Um literal de estrutura para usar no contexto de
pl.Expr.fill_null
pode ser criado dapl.struct
seguinte maneira.