问题描述
假设我在 redshift 中有下表:
table
| a | b |
|----:|----:|
| 3 | 1 |
| 1 | 8 |
| 7 | 6 |
| 4 | 0 |
| 5 | 6 |
| 5 | 2 |
| 5 | 9 |
| 4 | 3 |
| 7 | 9 |
| 9 | 8 |
在python中,我具有以下元组列表:
x = [(3,1),(4,2),(10,(7,9),(5,(6,1)]
我想使用pd.read_sql_query`从元组(a,b)
在x中的表中提取所有行。
如果我只有一列,那将是一个简单的sql WHERE子句,类似于:
query = f'''
SELECT *
FROM table
WHERE a IN {x_sql}
'''
pd.read_sql_query(query,engine)
我的最终结果将是:
| a | b |
|----:|----:|
| 3 | 1 |
| 5 | 2 |
| 7 | 9 |
#doesn't work
SELECT *
FROM table
WHERE a,b IN ((3,1))
解决方法
IIUC,我们可以将.stack
和isin
和.loc
一起使用以对索引进行过滤。
x = [(3,1),(4,2),(10,(7,9),(5,(6,1)]
df.loc[df.stack().groupby(level=0).agg(tuple).isin(x)]
a b
1 3 1
6 5 2
9 7 9