我正在尝试通过比较两个数据框dfcompare = (df0 == df1)
,并且空值永远不会被视为相同(不像join
没有允许空值匹配的选项)。
我对其他字段的方法是使用适合其数据类型的“空值”填充它们。我应该对结构体使用什么?
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)
输出:
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"
我令人满意的解决方法是改为使用unnest
列。这很好用(甚至更好,因为它允许逐个子字段填充)。不过,我仍然好奇如何实现可以传递给这些类型的函数的合适的“结构文字”。
你也可以想象想要添加一个硬编码的列,如下所示df4 = df.with_columns(pl.lit("0").alias("zerocol"))
将数据框与缺失值进行比较
有一个帧级别的
pl.DataFrame.equals
,它接受一个null_equal
默认为 的参数True
。它可以按如下方式使用。可以用如下方式
pl.Expr.fill_null
创建在上下文中使用的结构文字。pl.struct