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

如何用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 04:47:15