ewm_mean 忽略南
ewm_mean ignore nan
给定一系列可能的 NaN
值,如何告诉 polars 忽略 NaN
值?也就是说,将 NaN
值视为不在 DataFrame 中,并使用与 NaN
值之前的单元格中相同的均值。
我想你想要的是fill_nan
方法。目前有一种 request to expand the fill_nan
method to have the same handy options as the fill_null
方法(即 'forward'、'backward'、'mean' 等)。
但我们可以通过一些小的变通方法获得相同的结果。假设我们的数据如下所示:
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_column(pl.col("val").fill_nan(None).keep_name())
.with_columns(
[
pl.col("val").fill_null("forward").over("group").alias("fill_forward"),
pl.col("val").fill_null("backward").over("group").alias("fill_back"),
pl.col("val").fill_null("mean").over("group").alias("fill_mean"),
pl.col("val").fill_null("zero").over("group").alias("fill_zero"),
pl.col("val").fill_null("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_column(pl.col("val").fill_nan(None).keep_name())
.with_column(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 │
└───────┴─────┴──────┴───────┘
给定一系列可能的 NaN
值,如何告诉 polars 忽略 NaN
值?也就是说,将 NaN
值视为不在 DataFrame 中,并使用与 NaN
值之前的单元格中相同的均值。
我想你想要的是fill_nan
方法。目前有一种 request to expand the fill_nan
method to have the same handy options as the fill_null
方法(即 'forward'、'backward'、'mean' 等)。
但我们可以通过一些小的变通方法获得相同的结果。假设我们的数据如下所示:
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_column(pl.col("val").fill_nan(None).keep_name())
.with_columns(
[
pl.col("val").fill_null("forward").over("group").alias("fill_forward"),
pl.col("val").fill_null("backward").over("group").alias("fill_back"),
pl.col("val").fill_null("mean").over("group").alias("fill_mean"),
pl.col("val").fill_null("zero").over("group").alias("fill_zero"),
pl.col("val").fill_null("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_column(pl.col("val").fill_nan(None).keep_name())
.with_column(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 │
└───────┴─────┴──────┴───────┘