如何在结构列上 fill_null?

问题描述 投票:0回答:1

我试图通过

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"))

所示
python python-polars
1个回答
0
投票

关于源问题:有一个帧级

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
© www.soinside.com 2019 - 2024. All rights reserved.