如何在Polars DataFrame中按关联特征的中位数填充空值?
在Polars中按分组中位数填充空值的实现方法
针对你需要按IMDB Score分组,用组内Meta Score的中位数填充空值的需求,Polars提供了两种简洁高效的实现方式,以下是具体代码和说明:
方法一:使用窗口函数(推荐)
这种方式利用Polars的窗口函数over直接在原DataFrame上操作,无需额外的分组聚合与连接操作,代码更简洁且性能更优:
df = df.with_columns( pl.col("Meta Score").fill_null( pl.col("Meta Score").median().over("IMDB Score") ) )
代码解释:
with_columns:用于修改或添加DataFrame中的列fill_null:指定空值的填充规则pl.col("Meta Score").median().over("IMDB Score"):通过窗口函数over按IMDB Score分组,计算每组Meta Score的中位数,并用该值填充组内的空值
执行后得到的结果如下:
┌──────┬────────────┬────────────┐ │ Name ┆ IMDB Score ┆ Meta Score │ │ --- ┆ --- ┆ --- │ │ str ┆ i64 ┆ f64 │ ╞══════╪════════════╪════════════╡ │ B ┆ 8 ┆ 86.0 │ │ C ┆ 8 ┆ 90.0 │ │ D ┆ 8 ┆ 90.0 │ │ E ┆ 8 ┆ 91.0 │ │ D ┆ 7 ┆ 66.0 │ │ D ┆ 3 ┆ 44.0 │ └──────┴────────────┴────────────┘
方法二:分组聚合后连接
如果你更习惯类似Pandas的分组-聚合-填充逻辑,也可以先计算各组的中位数,再通过连接操作填充空值:
# 1. 计算每组的Meta Score中位数 median_groups = df.group_by("IMDB Score").agg( pl.col("Meta Score").median().alias("Group Median") ) # 2. 左连接原数据,填充空值后删除临时列 df = df.join(median_groups, on="IMDB Score").with_columns( pl.col("Meta Score").fill_null(pl.col("Group Median")) ).drop("Group Median")
与Pandas写法的对比
对比你提供的Pandas代码:
df.to_pandas().groupby('IMDB Score')['Meta Score'].apply(lambda x: x.fillna(x.median()))
Polars的窗口函数写法无需使用apply这类非向量化操作,避免了隐式循环,在处理大数据集时性能优势更明显,同时代码结构更直观。
内容的提问来源于stack exchange,提问作者Regular Tech Guy
相关产品推荐
相关产品推荐

