在pandas中按组交叉合并

2 投票
1 回答
48 浏览
提问于 2025-04-14 17:25

我正在尝试将两个数据框进行交叉合并,但我想限制合并的结果,只包含同一组内的组合。Pandas的文档中提到:进行交叉合并时,不允许指定合并的列。目前为了实现这个目标,我使用了一个循环,并把结果的数据框拼接在一起,但我想知道有没有更高效的方法?

示例输入数据:

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])

1 个回答

2

按组进行交叉合并就相当于在这个组上进行一次merge操作:

out = df1.merge(df2, on='group')

# if "group" is the only common column
# out = df1.merge(df2)

输出结果:

   group field_a     field_b
0      1   apple       apple
1      1   apple  strawberry
2      1    pear       apple
3      1    pear  strawberry
4      2  banana     coconut
5      2  banana      papaya
6      2  papaya     coconut
7      2  papaya      papaya

在pandas中还没有how='cross'这个选项之前,进行交叉合并的方法实际上是添加一个虚拟的键,然后在这个键上进行合并:

# before
df1['key'] = 1
df2['key'] = 1
df1.merge(df2, on='key').drop(columns=['key'])

# now
df1.merge(df2, how='cross')

撰写回答