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

如何有条件选择列并合并结构不同的Polars DataFrame?

解决Polars合并列结构不一致DataFrame的问题

错误原因

你遇到的ColumnNotFoundError是因为第一个DataFrame根本没有c列,直接用pl.col('c')会让Polars找不到对应列而报错。处理缺失列时,不能直接引用不存在的列,得用pl.lit(None)生成空值列。

完整解决方案

要实现缺失列填充None+统一数据类型的合并,步骤如下:

  1. 收集所有DataFrame的列名,得到全量列集合
  2. 定义每列的目标数据类型
  3. 对每个DataFrame标准化:存在的列转换类型,不存在的列生成空值并设置类型
  4. 合并标准化后的DataFrame

代码实现

import polars as pl

# 你的原始DataFrame列表
Ldfs=[
     pl.DataFrame({'a':[1.0,2.0,3.1], 'b':[2,3,4]}), 
     pl.DataFrame({'b':[1,2,3], 'c':[2,3,4]}), 
     pl.DataFrame({'a':[1,2,3], 'c':[2,3,4]})
    ]

# 1. 获取所有列的并集
all_columns = sorted({col for df in Ldfs for col in df.columns})

# 2. 定义各列的目标数据类型(可根据需求调整)
dtype_map = {
    'a': pl.Float64,
    'b': pl.Float64,
    'c': pl.Float64
}

# 3. 标准化单个DataFrame的函数
def standardize_df(df, target_cols, dtype_map):
    exprs = []
    for col in target_cols:
        if col in df.columns:
            # 列存在:转换为目标类型
            expr = pl.col(col).cast(dtype_map[col]).alias(col)
        else:
            # 列不存在:生成空值列并设置目标类型
            expr = pl.lit(None).cast(dtype_map[col]).alias(col)
        exprs.append(expr)
    return df.select(exprs)

# 处理所有DataFrame
standardized_dfs = [standardize_df(df, all_columns, dtype_map) for df in Ldfs]

# 4. 合并结果
combined_df = pl.concat(standardized_dfs)
print(combined_df)

运行结果

shape: (9, 3)
┌──────┬──────┬──────┐
│ a    ┆ b    ┆ c    │
│ ---  ┆ ---  ┆ ---  │
│ f64  ┆ f64  ┆ f64  │
╞══════╪══════╪══════╡
│ 1.0  ┆ 2.0  ┆ null │
│ 2.0  ┆ 3.0  ┆ null │
│ 3.1  ┆ 4.0  ┆ null │
│ null ┆ 1.0  ┆ 2.0  │
│ null ┆ 2.0  ┆ 3.0  │
│ null ┆ 3.0  ┆ 4.0  │
│ 1.0  ┆ null ┆ 2.0  │
│ 2.0  ┆ null ┆ 3.0  │
│ 3.0  ┆ null ┆ 4.0  │
└──────┴──────┴──────┘

针对你原代码的修复

如果你只想单独给第一个DF添加c列并转类型,应该这样写:

# 给Ldfs[0]添加c列(空值,类型Float64)
df_with_c = Ldfs[0].with_columns(pl.lit(None).cast(pl.Float64).alias('c'))
print(df_with_c)

内容的提问来源于stack exchange,提问作者Dean MacGregor

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 10:10:21