我正在try 交叉合并两个数据帧,但限制了合并,以便仅提供同一组内的组合.大Pandas 的文件上说是When performing a cross merge, no column specifications to merge on are allowed只.目前,为了实现这一点,我使用了for循环并连接生成的DFS,但是有没有更有效的方法呢?

输入数据示例:

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

推荐答案

按组进行交叉合并相当于组上的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')

Python相关问答推荐

滚动和,句号来自Pandas列

使用索引列表列表对列进行切片并获取行方向的向量长度

不理解Value错误:在Python中使用迭代对象设置时必须具有相等的len键和值

为什么这个带有List输入的简单numba函数这么慢

ODE集成中如何终止solve_ivp的无限运行

如何使Matplotlib标题以图形为中心,而图例框则以图形为中心

不能使用Gekko方程'

需要帮助重新调整python fill_between与数据点

如何使regex代码只适用于空的目标单元格

matplotlib图中的复杂箭头形状

numpy.unique如何消除重复列?

pandas:在操作pandora之后将pandora列转换为int

如何在GEKKO中使用复共轭物

如何使用Azure Function将xlsb转换为xlsx?

如何提高Pandas DataFrame中随机列 Select 和分配的效率?

与同步和异步客户端兼容的Python函数

FileNotFoundError:[WinError 2]系统找不到指定的文件:在os.listdir中查找扩展名

Scipy.linprog的可行性有问题吗?(A_ub@x0<;=b_ub).all()为True-但是-linprog(np.zeros_like(X0),A_ub=A_ub,b_ub=b_ub)不可行

大Pandas 中的群体交叉融合

组颠倒大Pandas 数据帧