我不知道如何在 pandas 中使用类似的合并和连接语法来实现以下目标,
SELECT *
FROM a
INNER JOIN b
ON a.column1 >= b.column1 AND a.column1 <= b.column2
Run Code Online (Sandbox Code Playgroud)
但上面的查询也可以隐式写为:
SELECT *
FROM a, b
WHERE a.column1 >= b.column1 AND a.column1 <= b.column2
Run Code Online (Sandbox Code Playgroud)
这基本上是旧语法,应该完全相同(性能方面)。它采用 2 个表的笛卡尔积(或交叉联接),然后使用 WHERE 条件从其中进行选择,这可以在 pandas 中轻松实现。这可能会占用大量内存,但速度应该很快。
首先是FROM a, b子句(我们临时在所有行中分配具有相同值的列,因此我们可以对其进行交叉连接);
df = pd.merge(a.assign(key=0), b.assign(key=0), on='key').drop('key', axis=1)
Run Code Online (Sandbox Code Playgroud)
然后使用布尔索引(我们的WHERE子句)对帧进行切片;
df[(df["column1_x"] >= df["column1_y"]) & (df["column1_x"] <= df["column2_y"])]
Run Code Online (Sandbox Code Playgroud)
如果您不想要笛卡尔积而只想比较两个表的相同索引上的行,您可以像这样合并索引;
df = a.merge(b, left_index = True, right_index = True)
Run Code Online (Sandbox Code Playgroud)
如果它们长度相同,则在轴 1 上连接;
df = pd.concat([a, b], axis=1)
Run Code Online (Sandbox Code Playgroud)
并再次使用布尔索引来消除结果;
df[(df["column1_x"] >= df["column1_y"]) & (df["column1_x"] <= df["column2_y"])]
Run Code Online (Sandbox Code Playgroud)