如何有条件选择列并合并结构不同的Polars DataFrame?
解决Polars合并列结构不一致DataFrame的问题
错误原因
你遇到的ColumnNotFoundError是因为第一个DataFrame根本没有c列,直接用pl.col('c')会让Polars找不到对应列而报错。处理缺失列时,不能直接引用不存在的列,得用pl.lit(None)生成空值列。
完整解决方案
要实现缺失列填充None+统一数据类型的合并,步骤如下:
- 收集所有DataFrame的列名,得到全量列集合
- 定义每列的目标数据类型
- 对每个DataFrame标准化:存在的列转换类型,不存在的列生成空值并设置类型
- 合并标准化后的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
相关产品推荐
相关产品推荐

