Pandas 数据框合并的工作量更大还是更少?

J.B*_*Bao 5 python merge dataframe pandas

现在我需要合并两个条件大于(>=)的数据框。但是merge只支持equal。有什么办法可以处理吗?谢谢!

umu*_*tto 5

我不知道如何在 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)