如何在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
相关产品推荐
相关产品推荐

