未知匹配列名时如何合并(Join/Concat)Polars DataFrames
解决Polars中动态公共列的DataFrame合并问题
你的需求是合并两个有数量不固定公共列(内容完全匹配)的DataFrame,最终保留所有唯一列且公共列只出现一次,用join操作就能完美实现,具体步骤如下:
- 自动识别公共列:通过列名集合的交集获取两个DataFrame的公共列,无需硬编码列名,适配公共列数量变化的场景。
- 执行内连接:以公共列为连接键,由于公共列内容完全一致,内连接会精准对齐行,同时自动去重公共列,合并所有其他列。
完整代码示例
import polars as pl data1 = { 'A': [1, 2, 3], 'B': [4, 5, 6], 'C': [7, 8, 9] } df1 = pl.DataFrame(data1) data2 = { 'B': [4, 5, 6], 'C': [7, 8, 9], 'D': [1, 2, 3] } df2 = pl.DataFrame(data2) # 获取两个DataFrame的公共列 common_cols = list(set(df1.columns) & set(df2.columns)) # 执行合并(内连接自动处理公共列去重与行对齐) merged_df = df1.join(df2, on=common_cols) print(merged_df)
输出结果
shape: (3, 4) ┌─────┬─────┬─────┬─────┐ │ A ┆ B ┆ C ┆ D │ │ --- ┆ --- ┆ --- ┆ --- │ │ i64 ┆ i64 ┆ i64 ┆ i64 │ ╞═════╪═════╪═════╪═════╡ │ 1 ┆ 4 ┆ 7 ┆ 1 │ │ 2 ┆ 5 ┆ 8 ┆ 2 │ │ 3 ┆ 6 ┆ 9 ┆ 3 │ └─────┴─────┴─────┴─────┘
为什么不用concat?
如果直接用pl.concat([df1, df2], how="horizontal"),会直接拼接所有列,导致公共列(如B、C)重复出现,不符合你的需求。而join操作会利用公共列的匹配关系,自动完成行对齐和公共列去重,更贴合场景。
内容的提问来源于stack exchange,提问作者BhanuKiran
相关产品推荐
相关产品推荐

