在pandas中有内部连接的条件

时间:2014-12-08 18:25:14

标签: python sql python-3.x pandas

我想在pandas中实现以下sql等价 -

SELECT 
    A.col1,
    A.col2,
    A.col3,
    A.col4,
    A.col5
FROM Table1 A
INNER JOIN Table1 b
ON   A.col1  = B.col1 AND
     A.col2  = B.col2
WHERE 
    (A.col3 <> 0) AND   
    (A.col4 <> B.col4) 

我能够实现的大熊猫部分是 -

#Dataframe dfTable1All contains the columns col1, col2, col3, col4, col5
#Dataframe dfTable1 contains the columns col1, col2, col4

dfTable1All = dfTable1All [(dfTable1All ['col3'] <> 0)]

dfjoin = pd.merge(dfTable1All, dfTable1, on=('col1','col2'), how='inner')

你能帮我解决一下如何使用内连接的where条件吗?

WHERE (A.col4 <> B.col4)

感谢。

2 个答案:

答案 0 :(得分:1)

如果查看merge文档字符串,则列上具有相同名称的后缀的选项。默认值为'_x''_y'。因此,要过滤两个col4不相等的位置,您可以这样做:

dfjoin = dfjoin[dfjoin['col4_x'] != dfjoin['col4_y']]

答案 1 :(得分:1)

我会将其分解为单独的操作

dfA.set_index(['col1', 'col2'], inplace=True)
dfB.set_index(['col1', 'col2'], inplace=True)

dfAB = dfA.join(dfB, rsuffix='_A', lsuffix='_B')

dfAB.query("col3_A != 0 and col4_A != col4_B")