我试图通过
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
。可以按如下方式使用。
import polars as pl
df = pl.DataFrame({
"a": [0, 1, None],
"b": [True, None, False],
})
df.equals(df, null_equal=True)
True