gpt4 book ai didi

python - 在 Python 中复制 SQL 的 'Join'

转载 作者:太空宇宙 更新时间:2023-11-03 12:52:09 25 4
gpt4 key购买 nike

我正在尝试从 R 切换到 Python(主要是关于一般灵 active 的问题)。借助 Numpy、matplotlib 和 ipython,我能够涵盖除合并“数据集”之外的所有用例。我想纯粹在 python 中模拟 SQL 的 join by 子句(内部、外部、完整)。 R 使用“合并”功能处理此问题。

我已经尝试过 numpy.lib.recfunctions join_by,但它与“键”上的重复项存在严重问题:


join_by(key, r1, r2, jointype='inner', r1postfix='1', r2postfix='2',
defaults=None, usemask=True, asrecarray=False)

在键 key 上连接数组 r1r2

键应该是一个字符串或对应的字符串序列到用于加入数组的字段。如果在两个输入中找不到 key 字段,则会引发异常数组。

r1r2 都不应该沿 key 有任何重复:存在重复项会使输出非常不可靠。注意重复算法不查找。

来源:http://presbrey.mit.edu:1234/numpy.lib.recfunctions.html


任何指点或帮助将不胜感激!

最佳答案

假设您在 Python 中表示相当于一个 SQL 表,作为字典列表,所有具有相同(假设为字符串)键的字典(其他表示,包括那些由 numpy 启用的,可以逻辑上归结为等效形式)。现在,内部连接(同样,从逻辑的角度来看)是它们的笛卡尔积的投影——在一般情况下,采用谓词参数 on (它有两个参数,一个“记录” “[[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 的连接子句(内部、外部、完整)”)确实没有其他选择,因为 JOINON 子句非常不受限制。

对于外连接和全连接,您还需要保留信息来标识哪些记录 [[来自一个或两个表]] 尚未产生,否则产生——例如对于左连接,您将添加一个 bool 值,在 for r2 内循环之前重置为 yielded = False,如果 设置为 True code>yield 执行,在内循环之后,if not yielded:,生成一个人工连接的记录(大概使用 None 代表 NULL 代替缺少的 v2 值,因为没有 r2 可实际用于该目的)。

要获得任何实质性的效率改进,您需要阐明您愿意遵守哪些关于 on 谓词和表的约束——我们已经从您的问题中知道您不能在任一表的键上使用 unique 约束,但还有许多其他约束可能会有所帮助,让我们猜测这些约束实际适用于您的情况将是一项非常无益的努力。

关于python - 在 Python 中复制 SQL 的 'Join',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2983268/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com