现在我需要合并两个数据帧,条件大于(> =)。但合并只支持平等。有什么办法可以解决吗?谢谢!
答案 0 :(得分:0)
我不知道如何在pandas中使用类似的合并和连接语法来实现以下功能,
SELECT *
FROM a
INNER JOIN b
ON a.column1 >= b.column1 AND a.column1 <= b.column2
但上面的查询也可以隐式写成;
SELECT *
FROM a, b
WHERE a.column1 >= b.column1 AND a.column1 <= b.column2
这基本上是旧语法,应该完全相同(性能明智)。它需要2个表(或交叉连接)的笛卡尔积,然后使用WHERE条件从中选择,这可以很容易地在pandas中实现。这可能对记忆有点沉重,但应该很快。
首先是FROM a, b
子句(我们暂时在所有行中分配一个具有相同值的列,因此我们可以在它上交叉连接);
df = pd.merge(a.assign(key=0), b.assign(key=0), on='key').drop('key', axis=1)
然后使用布尔索引(我们的WHERE
子句)对帧进行切片;
df[(df["column1_x"] >= df["column1_y"]) & (df["column1_x"] <= df["column2_y"])]
如果您不想要笛卡尔积,并且只想比较两个表的相同索引上的行,则可以像这样合并索引;
df = a.merge(b, left_index = True, right_index = True)
如果长度相同,则在轴1上或连续;
df = pd.concat([a, b], axis=1)
再次使用布尔索引来消除结果;
df[(df["column1_x"] >= df["column1_y"]) & (df["column1_x"] <= df["column2_y"])]