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

如何高效实现Pandas中按组的交叉合并(Cross Merge)?

问题

需要对两个DataFrame执行组内交叉合并(仅保留同一group内field_a与field_b的所有组合),但Pandas官方文档明确限制:When performing a cross merge, no column specifications to merge on are allowed(执行交叉合并时不允许指定合并列)。目前通过循环分组合并后拼接的方式实现,希望找到更高效的替代方案。

示例输入数据

import pandas as pd

df1 = pd.DataFrame({
    'group': [1, 1, 2, 2],
    'field_a': ['apple', 'pear', 'banana', 'papaya']
})

df2  = pd.DataFrame({
    'group': [1, 1, 2, 2],
    'field_b': ['apple', 'strawberry', 'coconut', 'papaya']
})

期望输出

pd.DataFrame({'group': [1, 1, 1, 1, 2, 2, 2, 2],
             'field_a': ['apple', 'apple', 'pear', 'pear', 'banana', 'banana', 'papaya', 'papaya'],
             'field_b': ['apple', 'strawberry', 'apple', 'strawberry', 'coconut', 'papaya', 'coconut', 'papaya']})

当前实现方式

cols = ['group', 'field_a', 'field_b']
all_possible_matches = pd.DataFrame({
        col: [] for col in cols
    })
for group in [1, 2]:
    combined = df1[df1['group'] == group].merge(df2[df2['group'] == group][['field_b']], how='cross')
    all_possible_matches = pd.concat([all_possible_matches, combined])

高效实现方法

方法一:利用临时dummy列实现组内交叉合并

通过给两个DataFrame添加相同的临时列,再按group和临时列执行合并,本质是让同一group内的所有行两两配对,最后删除临时列即可。此方法避免了循环和额外的分组开销,大数据量下性能最优:

# 添加临时dummy列
df1['dummy'] = 1
df2['dummy'] = 1

# 按group和dummy合并,实现组内交叉
result = pd.merge(df1, df2, on=['group', 'dummy']).drop('dummy', axis=1)

# 可选:恢复原始DataFrame结构
df1.drop('dummy', axis=1, inplace=True)
df2.drop('dummy', axis=1, inplace=True)

方法二:groupby + apply 实现组内交叉合并

如果不想修改原始DataFrame,可通过分组后对每个group单独执行交叉合并,再统一合并结果:

result = df1.groupby('group', group_keys=False).apply(
    lambda g: g.merge(df2[df2['group'] == g.name], how='cross')
)

两种方案对比:方法一依赖Pandas底层优化的merge操作,性能更优;方法二更直观易懂,适合小数据集或需保留原始数据结构的场景。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.28 12:05:24