Python Polars实现类似Pandas .update()的DataFrame批量更新
用Polars实现类似Pandas .update()的批量更新功能
要实现用透视表_ct中的数据批量更新全零DataFrametabstr,可以通过左连接+coalesce函数的方式完成,无需逐列手动处理。具体步骤如下:
1. 准备示例数据
假设我们有以下两个DataFrame:
import polars as pl # 全零结构的目标DataFrame tabstr = pl.DataFrame({ "id": [1, 2, 3, 4], "销量_A": [0, 0, 0, 0], "销量_B": [0, 0, 0, 0], "销量_C": [0, 0, 0, 0] }) # 包含实际数据的透视表(仅部分行有值) _ct = pl.DataFrame({ "id": [1, 3], "销量_A": [150, 320], "销量_B": [210, 400] })
2. 左连接两个DataFrame
以共同键(比如id)进行左连接,为透视表的列添加_right后缀,确保和tabstr的列区分开:
joined = tabstr.join(_ct, on="id", how="left", suffix="_right")
3. 批量生成更新表达式
遍历tabstr的所有列,对存在于_ct中的列,用pl.coalesce优先取_right列的非空值,否则保留原零值;对不存在于_ct的列,直接保留原值:
# 定义连接键(根据你的实际情况调整) join_keys = ["id"] update_exprs = [] for col in tabstr.columns: if col not in join_keys and col in _ct.columns: # 用_right列的值更新原列 update_exprs.append( pl.coalesce([pl.col(f"{col}_right"), pl.col(col)]).alias(col) ) else: # 无需更新,保留原列 update_exprs.append(pl.col(col))
4. 生成最终更新后的DataFrame
通过select应用表达式,得到和tabstr结构一致的更新结果:
updated_tabstr = joined.select(update_exprs) print(updated_tabstr)
输出结果:
shape: (4, 4) ┌─────┬─────────┬─────────┬─────────┐ │ id ┆ 销量_A ┆ 销量_B ┆ 销量_C │ │ --- ┆ --- ┆ --- ┆ --- │ │ i64 ┆ i64 ┆ i64 ┆ i64 │ ╞═════╪═════════╪═════════╪═════════╡ │ 1 ┆ 150 ┆ 210 ┆ 0 │ │ 2 ┆ 0 ┆ 0 ┆ 0 │ │ 3 ┆ 320 ┆ 400 ┆ 0 │ │ 4 ┆ 0 ┆ 0 ┆ 0 │ └─────┴─────────┴─────────┴─────────┘
关键说明
pl.coalesce函数会依次取第一个非空值,完美适配"有数据则更新,无数据则保留零值"的需求。- 若你的连接键是多列(比如
["地区", "月份"]),只需修改join_keys列表即可,逻辑完全通用。 - Polars采用不可变数据结构,此方法会生成新的DataFrame,而非原地修改原数据。
内容的提问来源于stack exchange,提问作者Suresh Nimbalkar
相关产品推荐
相关产品推荐

