在pandas中按组交叉合并
我正在尝试将两个数据框进行交叉合并,但我想限制合并的结果,只包含同一组内的组合。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')