如何基于两列对两个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
相关产品推荐
相关产品推荐

