You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.02 10:40:50