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

如何在Python中重现R语言的inner_join内连接操作

问题描述

我有一个结构如下的Pandas数据框Network:

{'Sup': {0: 1002000157,
  1: 1002000157,
  2: 1002000157,
  3: 1002000157,
  4: 1002000157,
  5: 1002000157,
  6: 1002000157,
  7: 1002000157,
  8: 1002000157,
  9: 1002000157,
  10: 1002000157,
  11: 1002000157,
  12: 1002000157,
  13: 1002000382,
  14: 1002000382,
  15: 1002000382,
  16: 1002000382,
  17: 1002000382,
  18: 1002000382,
  19: 1002000382,
  20: 1002000382,
  21: 1002000382,
  22: 1002000382,
  23: 1002000382,
  24: 1002000382,
  25: 1002000382,
  26: 1002000382,
  27: 1002000382,
  28: 1002000382,
  29: 1002000382},
 'Cust': {0: 1002438313,
  1: 8039296054,
  2: 9003188096,
  3: 14900070991,
  4: 17005234747,
  5: 18006860724,
  6: 28000286091,
  7: 29009623382,
  8: 39000007702,
  9: 39004420023,
  10: 46000088397,
  11: 50000063751,
  12: 7000090017,
  13: 1900120936,
  14: 1900779883,
  15: 2000013994,
  16: 2001222824,
  17: 2003032125,
  18: 2900121723,
  19: 2900197555,
  20: 2902742641,
  21: 3000101113,
  22: 3000195031,
  23: 3000318054,
  24: 3900091301,
  25: 3911084436,
  26: 4900112325,
  27: 5900720933,
  28: 7000001703,
  29: 8000004881}}

我想在Python里重现这条R命令(要避免内核中断):

NodesSharingSupplier <- inner_join(Network, Network,  by=c('Sup'='Sup'))

这是SQL风格的内连接,我怕没法用简单的基于Sup列的内合并实现,请问该怎么在Python里做?

解决方案

在Pandas里用merge方法就能实现和R中inner_join完全一样的效果,只要处理得当不会出现内核中断。

基础实现代码

import pandas as pd

# 如果还没把字典转成DataFrame,先执行这一步
Network = pd.DataFrame({
    'Sup': {0: 1002000157, ...},  # 实际使用时替换成完整的字典数据
    'Cust': {0: 1002438313, ...}
})

# 执行内连接,和R的inner_join逻辑完全一致
NodesSharingSupplier = pd.merge(Network, Network, on='Sup')

注意事项

  • Pandas的merge默认就是内连接(how='inner'),不用额外指定参数
  • on='Sup'表示基于Sup列做连接,和R里by=c('Sup'='Sup')的逻辑完全匹配
  • 连接后原有的Cust列会自动被重命名为Cust_x(左表的客户ID)和Cust_y(右表的客户ID),和R的命名规则一致

大数据量优化(避免内核中断)

如果你的数据集很大,直接全表merge可能会内存溢出导致内核中断,可以用分组后生成笛卡尔积的方式优化:

# 按Sup分组,收集每个供应商对应的所有客户ID
grouped = Network.groupby('Sup')['Cust'].apply(list).reset_index()

# 对每个供应商的客户列表生成笛卡尔积
def expand_cust(row):
    cust_list = row['Cust']
    return pd.DataFrame({
        'Sup': [row['Sup']] * len(cust_list)**2,
        'Cust_x': [c1 for c1 in cust_list for _ in cust_list],
        'Cust_y': [c2 for _ in cust_list for c2 in cust_list]
    })

# 拼接所有分组的结果
NodesSharingSupplier = pd.concat([expand_cust(row) for _, row in grouped.iterrows()], ignore_index=True)

这种方法先按供应商分组,再在组内处理客户的笛卡尔积,比全表merge更节省内存,适合大数据场景。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 09:57:20