Pandas中基于重复键合并两个DataFrame的技术求助
解决方案:实现DataFrame按指定列的全组合连接
你想要的效果其实是基于col2列的分组笛卡尔积连接——也就是把A中每个col2值对应的所有行,和B中同col2值的所有行进行全组合。之前用外连接没得到预期结果,大概率是操作时的参数设置问题,咱们来看看正确的实现方式:
步骤1:构造示例数据
先还原你的两个DataFrame:
import pandas as pd A = pd.DataFrame({ 'col1': ['abc', 'cdz'], 'col2': ['Pid1', 'Pid1'] }) B = pd.DataFrame({ 'col2': ['Pid1', 'Pid1', 'Pid1'], 'value': [2, 3, 4] })
步骤2:执行正确的连接操作
直接使用merge并指定on='col2'即可,默认的内连接会自动匹配相同col2值的行,并生成所有可能的组合:
result = A.merge(B, on='col2')
运行后输出的结果完全符合你的预期:
col1 col2 value 0 abc Pid1 2 1 abc Pid1 3 2 abc Pid1 4 3 cdz Pid1 2 4 cdz Pid1 3 5 cdz Pid1 4
为什么之前的外连接没生效?
如果你的实际操作中用了how='outer'却没得到想要的结果,可能有两种原因:
- 你没有指定
on='col2',导致merge尝试按所有同名列连接(虽然这里只有col2,但如果数据中有其他同名列就会出错); - 如果你的真实数据里
A或B存在col2的其他取值,外连接会保留那些没有匹配的行(比如A有Pid2但B没有,外连接会保留该行并填充value为NaN),而你需要的是仅保留有匹配的组合,这时用默认的内连接就足够了。
额外场景:完全笛卡尔积(不按col2匹配)
如果你需要的是不管col2值,直接让A的每一行和B的每一行组合,那么可以用how='cross'参数:
result = A.merge(B, how='cross')
不过这种方式会生成所有行的两两组合,只有当你不需要按col2过滤时才适用。
内容的提问来源于stack exchange,提问作者python_interest
相关产品推荐
相关产品推荐

