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

如何基于两列对两个Polars DataFrame执行外连接并筛选差异行?

基于AuctionId与RealmName组合筛选Polars DataFrame互不存在的行

我有两个均包含AuctionId和RealmName列的Polars DataFrame,需要基于这两列的组合,找出所有在对方DataFrame中不存在的行。以下是示例数据:

import polars as pl

dfdata = {"AuctionId": [2084868458, 2085008809, 2087827052, 2087835700, 2087827999, 2087827997],
         "RealmName": ['Gehennas', 'Gehennas', 'Mograine', 'Lakeshire', 'Gehennas', 'Bloodfang']}

df1data = {"AuctionId": [2084868458, 2085008342, 2087827052, 2087833212, 2087827999, 2087812997],
          "RealmName": ['Gehennas', 'Gehennas', 'Mograine', 'Lakeshire', 'Gehennas', 'Bloodfang']}

df = pl.DataFrame(dfdata)
df1 = pl.DataFrame(df1data)

# 预期结果:df1中存在但df中不存在的行
resultdata = {"AuctionId": [2085008342, 2087833212,2087812997],
         "RealmName": [ 'Gehennas', 'Lakeshire', 'Bloodfang']}
resultdf = pl.DataFrame(resultdata)
print(resultdf)

解决方案

1. 找出单个DataFrame独有的行(如df1中不在df里的行)

使用Polars的反连接(anti join),直接筛选左表中未在右表匹配到的行:

# 获取df1独有的行(AuctionId+RealmName组合不在df中)
df1_only = df1.join(df, on=["AuctionId", "RealmName"], how="anti")
print(df1_only)

输出结果与示例中的resultdf完全一致。如果要找df中独有的行,只需调换左右表位置:

df_only = df.join(df1, on=["AuctionId", "RealmName"], how="anti")

2. 找出两个DataFrame中所有互不存在的行(对称差集)

如果需要同时获取df独有的行和df1独有的行,可通过合并后去重的方式实现:

# 合并两个DataFrame,然后移除所有重复出现的组合,剩下的就是仅在单个DataFrame存在的行
symmetric_diff = pl.concat([df, df1]).unique(subset=["AuctionId", "RealmName"], keep="none")
print(symmetric_diff)

说明

  • 反连接是针对单个方向筛选的高效方式,时间复杂度更低。
  • 对称差集方法适合一次性获取两边的独有数据,keep="none"会保留所有仅出现一次的行。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 22:09:22