Pandas实现SQL非等值JOIN的方法咨询
嘿,这个问题很常见——pandas的merge默认只支持等值连接,所以直接在on参数里加非等值条件是行不通的。不过我们有几种简单的方法来实现你想要的逻辑,完全贴合你的需求:
方法一:先左连接,再过滤条件(最直观)
先按你原来的逻辑用name和city做左连接,之后再筛选出满足df1.year >= df2.year_min的行,同时保留左连接中df2没有匹配到的原始df1行(这是左连接的核心特性):
# 第一步:基于name和city完成左连接 joined_df = pd.merge(df1, df2, how='left', on=['name', 'city']) # 第二步:过滤满足year条件的行,同时保留df2无匹配的行(year_min为NaN的情况) joined_df = joined_df[(joined_df['year'] >= joined_df['year_min']) | joined_df['year_min'].isna()]
如果你喜欢更简洁的写法,可以用query方法一步到位:
joined_df = pd.merge(df1, df2, how='left', on=['name', 'city']).query('year >= year_min or year_min.isna()')
方法二:实现你给出的SQL内连接逻辑
注意到你提供的SQL是普通的JOIN(也就是内连接),如果你的实际需求是只保留同时满足三个条件的行(而不是保留所有df1行),那可以直接用内连接后过滤:
# 内连接+条件过滤,和你写的SQL逻辑完全一致 joined_df = pd.merge(df1, df2, how='inner', on=['name', 'city']).query('year >= year_min')
为什么不能直接在merge里加非等值条件?
pandas的merge函数的on/left_on/right_on参数仅支持列名等值匹配,不支持像>=这样的比较运算符。所以必须先完成等值连接,再通过布尔索引或query来筛选非等值条件的行。
内容的提问来源于stack exchange,提问作者firestreak
相关产品推荐
相关产品推荐

