gpt4 book ai didi

python - Pandas 中的 SQL 查询连接

转载 作者:行者123 更新时间:2023-12-04 10:34:36 26 4
gpt4 key购买 nike

我想在 Pandas 中加入两个表。

df_types
包含类型产品的范围大小(5000 行)

| Table: TYPES |          |      |
|--------------|----------|------|
| size_max | size_min | type |
| 1 | 5 | S |
| 6 | 16 | M |
| 16 | 24 | L |
| 25 | 50 | XL |

Pandas 中的数据框代码:
df_types = pd.DataFrame([[1,5,'S'],
[6,16,'M'],
[16,24,'L'],
[25,50,'XL']],
columns = ['size_min','size_max','type'])

df_products
包含产品 ID 和尺寸(12000 行)
| Table: Products |      |
|-----------------|------|
| id_product | size |
| A | 6 |
| B | 25 |
| C | 7 |
| D | 2 |
| F | 45 |
| E | 10 |
| G | 16 |

Pandas 中的数据框代码:
df_products = pd.DataFrame([['A',6,],
['B',25],
['C',7],
['D',2],
['F',45],
['E',10],
['G',16]],columns = ['id_product','size'])

我想让这个 SQL 加入 Pandas:
SELECT  *.df_products
type.df_types
FROM df_products LEFT JOIN df_types
ON df_products.size >= df_types.size_min
AND df_products.size <= df_types.size_max

结果:
| id_product | size | type |
|------------|------|------|
| A | 6 | M |
| B | 25 | XL |
| C | 7 | M |
| D | 2 | S |
| F | 45 | XL |
| E | 10 | M |
| G | 16 | M |

谢谢你! ;-)

最佳答案

方法一:outer joinpd.merge
虽然这是一个常见的操作SQL , 没有直接的方法可以使用 pandas .

这里的解决方案之一是执行 outer join匹配所有行,然后使用 DataFrame.query过滤 size 所在的行介于 size_min 之间& size_max .

但这会导致行数激增,因此在您的情况下 12000*5000 = 60 000 000行。

dfn = (
df_products.assign(key=1)
.merge(df_types.assign(key=1), on='key')
.query('size >= size_min & size < size_max')
.drop(columns='key')
)

id_product size size_min size_max type
1 A 6 6 16 M
7 B 25 25 50 XL
9 C 7 6 16 M
12 D 2 1 5 S
19 F 45 25 50 XL
21 E 10 6 16 M
26 G 16 16 24 L

方法二: pd.IntervalIndex :

如果您没有重叠范围,那么如果我们更改 size_min 16在数据框中 df_types15 ,我们可以使用这个方法。这不会导致行的爆炸。
idx = pd.IntervalIndex.from_arrays(df_types['size_min'], df_types['size_max'], closed='both')
event = df_types.loc[idx.get_indexer(df_products['size']), 'type'].to_numpy()

df_products['type'] = event

id_product size type
0 A 6 M
1 B 25 XL
2 C 7 M
3 D 2 S
4 F 45 XL
5 E 10 M
6 G 16 L

关于python - Pandas 中的 SQL 查询连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60248337/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com