Python相当于MySQL“Left Join”两个元组列表

时间:2016-07-16 03:33:49

标签: python left-join

这似乎很基础(虽然我来自MySQL背景)。

SELECT a.*, b.* FROM a LEFT JOIN b ON a[0] = b[0]

如果我在MySQL(LEFT JOIN)中这样做:

[(1,f,e,1,pp),(7,r,None,None,None),(2,s,f,None,None),(32,None,q,32,dd)]

我明白了:

{{1}}

如何实现这一目标?

(也许我不是在寻找合适的词......但我不想(想)我想追加或合并或连续......)

2 个答案:

答案 0 :(得分:5)

您可以通过从第二个输入列表中创建一个字典然后查找它来解决它:

>>> a = [(1,'f','e'),(7,'r',None),(2,'s','f'),(32,None,'q')]
>>> b = [(32,'dd'), (1,'pp')]
>>>
>>> b_dict = {item[0]: item for item in b}
>>> [item + b_dict.get(item[0], (None, None)) for item in a]
[
    (32, None, 'q', 32, 'dd'), 
    (1, 'f', 'e', 1, 'pp'), 
    (2, 's', 'f', None, None), 
    (7, 'r', None, None, None)
]

由于我们正在迭代a以形成结果列表,并查找第二个列表的值,这将作为“LEFT JOIN” - 从左“表”返回所有项目,即使他们没有出现在正确的“表格”中。

答案 1 :(得分:1)

您可以选择pandas作为解决方案。 pandas是一个与数据进程相关的python模块,它有MySQL接口,可以在其DataFrame中模拟数据库操作(如filter,join,groupby),请查看here了解详细信息。

import pandas as pd

# origin data
#a = [(1,f,e),(7,r,None),(2,s,f),(32,None,q)]
#b = [(32,dd), (1,pp)]

# new data
a = [{'a1':1,'a2':'f', 'a3':'e'}, {'a1':2, 'a2':'r', 'a3':None}]
b = [{'b1':32, 'b2':'dd'}, {'b1':1, 'b2':'pp'}]

pd_a = pd.DataFrame(a)
pd_b = pd.DataFrame(b)

result = pd.merge(pd_a, pd_b, left_on='a1', right_on='b1', how='left')
print result

输出如下:

   a1 a2    a3  b1   b2
0   1  f     e   1   pp
1   2  r  None NaN  NaN