ewm_mean 忽略 nan [已关闭]

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

给定一系列可能的

NaN
值,如何告诉极坐标忽略
NaN
值?也就是说,将
NaN
值视为不在 DataFrame 中,并使用与
NaN
值之前的单元格中相同的平均值。

为了 100% 具体,这是 panda 函数类 ewmrolling 的默认行为。

python dataframe rust python-polars rust-polars
1个回答
2
投票

我认为你想要的是

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   │
└───────┴─────┴──────┴───────┘
© www.soinside.com 2019 - 2024. All rights reserved.