如何用pd.merge高效实现DataFrame按group及df1.Month≥df2.Month合并?
解决方案
方法1:merge+query优化(原生pandas,高效简洁)
pd.merge本身不支持直接的不等值连接,但可以先按group做内连接,再用query过滤——query底层会优化执行逻辑,比普通布尔索引更高效,且避免了不必要的内存占用:
# 按group合并,给重复列名加后缀 merged = pd.merge(df1, df2, on='group', suffixes=('_df1', '_df2')) # 过滤符合条件的行 filtered = merged.query('Month_df1 >= Month_df2') # 整理成目标格式 result = filtered[['ID', 'Month_df2', 'value']].rename(columns={'Month_df2': 'Month'})
方法2:分组处理(超大数据集首选)
如果你的数据group类别很多,分组处理能避免跨group的无效笛卡尔积,进一步提升性能:
import numpy as np groups = df1['group'].unique() result_list = [] for g in groups: # 取出当前group的子数据集 df1_sub = df1[df1['group'] == g] df2_sub = df2[df2['group'] == g] # 生成符合Month条件的索引对 mask = df1_sub['Month'].values[:, np.newaxis] >= df2_sub['Month'].values idx1, idx2 = np.where(mask) # 拼接符合条件的行 temp = pd.concat([ df1_sub.iloc[idx1].reset_index(drop=True), df2_sub.iloc[idx2].reset_index(drop=True) ], axis=1) result_list.append(temp) # 合并所有分组结果并整理格式 result = pd.concat(result_list, ignore_index=True)[['ID', 'Month_y', 'value']].rename(columns={'Month_y': 'Month'})
方法3:第三方库pyjanitor(直接条件连接)
如果可以引入第三方库,pyjanitor的conditional_join支持直接定义连接条件,代码更直观:
import janitor result = df1.conditional_join( df2, on='group', condition=lambda x, y: x['Month'] >= y['Month'] )[['ID', 'Month_y', 'value']].rename(columns={'Month_y': 'Month'})
内容的提问来源于stack exchange,提问作者user13948
相关产品推荐
相关产品推荐

