给定一系列可能的
NaN
值,如何告诉极坐标忽略 NaN
值?也就是说,将 NaN
值视为不在 DataFrame 中,并使用与 NaN
值之前的单元格中相同的平均值。
我认为你想要的是
fill_nan
方法。 目前有一个 request 来扩展 fill_nan
方法,使其具有与 fill_null
方法相同的方便选项(即“向前”、“向后”、“平均”等)。
但是我们可以通过一些解决方法得到相同的结果。假设我们的数据如下所示:
df = pl.DataFrame(
{
"group": (["a"] * 3) + (["b"] * 4),
"obs": [1, 2, 3, 1, 2, 3, 4],
"val": [1.0, np.NaN, 3, 4, np.NaN, np.NaN, 7],
}
)
df
shape: (7, 3)
┌───────┬─────┬─────┐
│ group ┆ obs ┆ val │
│ --- ┆ --- ┆ --- │
│ str ┆ i64 ┆ f64 │
╞═══════╪═════╪═════╡
│ a ┆ 1 ┆ 1.0 │
│ a ┆ 2 ┆ NaN │
│ a ┆ 3 ┆ 3.0 │
│ b ┆ 1 ┆ 4.0 │
│ b ┆ 2 ┆ NaN │
│ b ┆ 3 ┆ NaN │
│ b ┆ 4 ┆ 7.0 │
└───────┴─────┴─────┘
只要您的列没有
null
值,我们就可以将 NaN
值转换为 null
,然后使用 fill_null
表达式。
(
df
.with_columns(pl.col("val").fill_nan(None))
.with_columns(
pl.col("val").fill_null(strategy="forward").over("group").alias("fill_forward"),
pl.col("val").fill_null(strategy="backward").over("group").alias("fill_back"),
pl.col("val").fill_null(strategy="mean").over("group").alias("fill_mean"),
pl.col("val").fill_null(strategy="zero").over("group").alias("fill_zero"),
pl.col("val").fill_null(strategy="one").over("group").alias("fill_one"),
)
)
shape: (7, 8)
┌───────┬─────┬──────┬──────────────┬───────────┬───────────┬───────────┬──────────┐
│ group ┆ obs ┆ val ┆ fill_forward ┆ fill_back ┆ fill_mean ┆ fill_zero ┆ fill_one │
│ --- ┆ --- ┆ --- ┆ --- ┆ --- ┆ --- ┆ --- ┆ --- │
│ str ┆ i64 ┆ f64 ┆ f64 ┆ f64 ┆ f64 ┆ f64 ┆ f64 │
╞═══════╪═════╪══════╪══════════════╪═══════════╪═══════════╪═══════════╪══════════╡
│ a ┆ 1 ┆ 1.0 ┆ 1.0 ┆ 1.0 ┆ 1.0 ┆ 1.0 ┆ 1.0 │
│ a ┆ 2 ┆ null ┆ 1.0 ┆ 3.0 ┆ 2.0 ┆ 0.0 ┆ 1.0 │
│ a ┆ 3 ┆ 3.0 ┆ 3.0 ┆ 3.0 ┆ 3.0 ┆ 3.0 ┆ 3.0 │
│ b ┆ 1 ┆ 4.0 ┆ 4.0 ┆ 4.0 ┆ 4.0 ┆ 4.0 ┆ 4.0 │
│ b ┆ 2 ┆ null ┆ 4.0 ┆ 7.0 ┆ 5.5 ┆ 0.0 ┆ 1.0 │
│ b ┆ 3 ┆ null ┆ 4.0 ┆ 7.0 ┆ 5.5 ┆ 0.0 ┆ 1.0 │
│ b ┆ 4 ┆ 7.0 ┆ 7.0 ┆ 7.0 ┆ 7.0 ┆ 7.0 ┆ 7.0 │
└───────┴─────┴──────┴──────────────┴───────────┴───────────┴───────────┴──────────┘
您还可以使用具有
null
值的其他方法,例如 interpolate
。
(df
.with_columns(pl.col("val").fill_nan(None))
.with_columns(pl.col("val").interpolate().over("group").alias("inter"))
)
shape: (7, 4)
┌───────┬─────┬──────┬───────┐
│ group ┆ obs ┆ val ┆ inter │
│ --- ┆ --- ┆ --- ┆ --- │
│ str ┆ i64 ┆ f64 ┆ f64 │
╞═══════╪═════╪══════╪═══════╡
│ a ┆ 1 ┆ 1.0 ┆ 1.0 │
│ a ┆ 2 ┆ null ┆ 2.0 │
│ a ┆ 3 ┆ 3.0 ┆ 3.0 │
│ b ┆ 1 ┆ 4.0 ┆ 4.0 │
│ b ┆ 2 ┆ null ┆ 5.0 │
│ b ┆ 3 ┆ null ┆ 6.0 │
│ b ┆ 4 ┆ 7.0 ┆ 7.0 │
└───────┴─────┴──────┴───────┘