如何同时更新Polars DataFrame重复列并新增独有列?
更优的实现方式
你可以用with_columns替代hstack来添加新列,代码更简洁直观:
result = df1.update(df2).with_columns(df2.select(set(df2.columns) - set(df1.columns)))
如果需要严格保持列顺序(和期望结果一致:先保留df1原有列,再添加df2新列),可以写成:
new_cols = [c for c in df2.columns if c not in df1.columns] result = df1.update(df2).with_columns(df2.select(new_cols))
为什么这更优?
with_columns是Polars中添加/修改列的标准方法,语义更清晰,相比hstack更贴合“添加新列到已有DataFrame”的操作意图。- 用集合运算
set(df2.columns) - set(df1.columns)替代列表推导,代码更简洁(Python 3.9+支持集合差运算)。
另外,如果你想一步完成更新和添加列,也可以用with_columns结合coalesce处理已有列的更新逻辑(和update行为一致:仅用df2的非null值覆盖df1对应位置):
common_cols = set(df1.columns) & set(df2.columns) new_cols = set(df2.columns) - set(df1.columns) result = df1.with_columns( # 更新共有列:保留df1非null值,用df2值填充df1的null [pl.coalesce(pl.col(c), df2[c]).alias(c) for c in common_cols], # 添加df2独有的列 df2.select(new_cols) ).select(df1.columns + list(new_cols)) # 保持列顺序与原df1一致
这种方式不需要调用update,直接通过表达式完成所有操作,逻辑更统一,也便于后续扩展修改。
内容的提问来源于stack exchange,提问作者Alena Volkova
相关产品推荐
相关产品推荐

