在Python中复制SQL的“Join”
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了在Python中复制SQL的“Join”,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2032字,纯文字阅读大概需要3分钟。
内容图文
![在Python中复制SQL的“Join”](/upload/InfoBanner/zyjiaocheng/898/263149583fa64a119b149a2881e6f824.jpg)
我正在尝试从R切换到Python(主要是围绕一般灵活性的问题).使用Numpy,matplotlib和ipython,除了合并“数据集”之外,我还能够覆盖我的所有用例.我想纯粹在python中模拟SQL的join by子句(inner,outer,full). R使用’merge’函数处理它.
我已经尝试了numpy.lib.recfunctions join_by,但它与’key’重复的关键问题:
join_by(key, r1, r2, jointype='inner', r1postfix='1', r2postfix='2',
defaults=None, usemask=True, asrecarray=False)
在密钥上加入数组r1和r2.
密钥应该是字符串或对应的字符串序列
到用于加入数组的字段.
如果在两个输入中找不到关键字段,则会引发异常
阵列.
r1和r2都不应该在键上有任何重复:存在
重复将使输出非常不可靠.请注意重复
没有被算法查找.
来源:http://presbrey.mit.edu:1234/numpy.lib.recfunctions.html
任何指针或帮助将非常感谢!
解决方法:
假设您在Python中表示SQL表的等价物作为dicts列表,所有dicts具有相同(假设字符串)键(其他表示形式,包括由numpy启用的表示,可以在逻辑上归结为等效形式).现在,内部联接(再次,从逻辑的角度来看)是他们的笛卡尔积的投影 – 在一般情况下,采用谓词参数(它带有两个参数,一个“记录”[[dict]]来自每个表,并且如果需要连接两个记录则返回真值),一个简单的方法是(使用每个表的前缀来消除歧义,以防止两个表可能具有同等“字段”的风险):
def inner_join(tab1, tab2, prefix1, prefix2, on):
for r1 in tab1:
for r2 in tab2:
if on(r1, r2):
row = dict((prefix1 + k1, v1) for k1, v1 in r1.items())
row.update((prefix2 + k2, v2) for k2, v2 in r2.items())
yield row
现在,你当然不希望这样做,因为性能是O(M * N) – 但是,为了你已经指定的一般性(“模拟SQL的连接子句(内部,外部,完整)” )实际上没有其他选择,因为JOIN的ON子句非常不受限制.
对于外连接和完全连接,您还需要保留信息,以识别哪些记录[[来自一个或两个表]]尚未产生,否则产生 – 例如对于左连接,你要添加一个bool,在for r2内循环之前重置为yielded = False,如果yield执行则设置为True,在内循环之后,如果没有产生:,则产生一个人工连接记录(可能使用无代替NULL代替缺少的v2值,因为实际上没有用于此目的的r2).
为了获得任何实质性的效率改进,你需要澄清你愿意遵守的关于on谓词和表格的约束 – 我们已经从你的问题中知道你不能对任何一个表的键都有一个独特的约束,但是还有许多其他的限制可能会有所帮助,让我们猜测在你的情况下实际适用的这些限制将是一个非常无益的努力.
内容总结
以上是互联网集市为您收集整理的在Python中复制SQL的“Join”全部内容,希望文章能够帮你解决在Python中复制SQL的“Join”所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。