如何在Polars中对结构体列的指定字段进行前向与后向空值填充?
如何在Polars中对结构体列的指定字段进行前向与后向空值填充?
问题原因分析
你原来的代码没达到预期效果,核心问题在于:当整个结构体列(比如df1或df2)的某一行是null时,这个结构体本身就不存在,你没法对一个不存在的结构体内部字段执行填充操作。你之前调用的pl.field("a").forward_fill()只对结构体非null的行里的字段有效,但对完全为null的结构体行起不到任何作用。
解决方案1:对整个结构体列进行填充(实现你预期的输出)
如果你的需求是让整个结构体列的空值行都用前后的完整结构体填充,直接对结构体列本身调用forward_fill()和backward_fill()即可——这样整个结构体的null会被前后的有效结构体替换,里面的a、b字段自然就有值了:
import polars as pl df1 = pl.LazyFrame({ "dt": [ "2024-08-30", "2024-08-02", "2024-09-03", "2024-09-04" ], "df1": { "a": [0.1, 0.2, 0.3, 0.1], "b": [0, -1, 2, 1] }, }).with_columns( pl.col("dt").str.to_datetime("%Y-%m-%d") ) df2 = pl.LazyFrame({ "dt": [ "2024-08-29", "2024-08-30", "2024-09-02", "2024-09-03" ], "df2":{ "a": [100, 120, -80, 20], "b": [1, -2, 0, 0] }, }).with_columns( pl.col("dt").str.to_datetime("%Y-%m-%d") ) df = pl.concat([df1, df2], how="align") # 修改核心逻辑:直接对结构体列做填充 df = df.with_columns( *[ pl.col(c).forward_fill().backward_fill() for c in ["df1", "df2"] ] ) print(df.collect())
运行这段代码后,就能得到你预期的输出结果。
解决方案2:只填充结构体中的指定字段
如果你只想填充结构体里的某一个字段(比如只填充df1的a字段,b字段保持原有的null),可以通过「展开结构体→单独填充目标字段→重新组合结构体」的流程实现:
df = pl.concat([df1, df2], how="align") # 步骤1:展开结构体列,得到单独的df1_a、df1_b、df2_a、df2_b列 df = df.with_columns( pl.col("df1").struct.unnest(), pl.col("df2").struct.unnest() ) # 步骤2:只对指定字段做填充,比如仅填充df1_a df = df.with_columns( pl.col("df1_a").forward_fill().backward_fill().alias("df1_a") # 若需要填充其他字段,在这里继续添加即可 ) # 步骤3:重新组合成结构体列,并删除临时展开的列 df = df.with_columns( pl.struct(["df1_a", "df1_b"]).alias("df1"), pl.struct(["df2_a", "df2_b"]).alias("df2") ).drop(["df1_a", "df1_b", "df2_a", "df2_b"]) print(df.collect())
这种方式可以精确控制要填充的结构体字段,灵活性更高。
备注:内容来源于stack exchange,提问作者Jan
相关产品推荐
相关产品推荐

