我有一个主键为user_id
的用户表和一个主键为item_id
的项目表。
然后我有另一个记录表,记录用户何时选择项目(多对多(。 它的属性包括user_id
、item_id
和pick_time
。
我想得到这样的桌子: 想要的查询结果
其中"1"表示用户至少选择过一次项目,而空白表示没有。
无论如何,请帮助我解决此问题:
- 如何编写 sql 代码来获取此查询集?
- 如果在sql查询中无法解决此问题,如何重构我的数据库?
对不起,我的SQL技能和表达能力不佳。
非常感谢!
您可以通过在熊猫中使用pivot_table来实现此目的。
import pandas as pd
data = {"Users": [1,2,3,4,5,1,2,5,1,2,4,5,2,3,4,5,4,5],
"Items":
['A','A','A','A','A','B','B','B','C','C','C','C','D','D','D','D','E','E']}
users_items_joined = pd.DataFrame(data, columns = ["Users", "Items"])
users_items_joined["count"] = 1
您现在将拥有类似于下面显示的内容,
Users Items count
0 1 A 1
1 2 A 1
2 3 A 1
3 4 A 1
4 5 A 1
5 1 B 1
6 2 B 1
7 5 B 1
8 1 C 1
9 2 C 1
10 4 C 1
11 5 C 1
12 2 D 1
13 3 D 1
14 4 D 1
15 5 D 1
16 4 E 1
17 5 E 1
您还可以从数据库中检索实际表并将其转换为pandas 数据帧,并对其应用以下函数以获取所需的用户项矩阵。
user_item_matrix = users_items_joined.pivot_table('count', 'Users', 'Items')
print(user_item_matrix)
上面的代码将准确给出您在提供的图像中请求的内容。
Items A B C D E
Users
1 1.0 1.0 1.0 NaN NaN
2 1.0 1.0 1.0 1.0 NaN
3 1.0 NaN NaN 1.0 NaN
4 1.0 NaN 1.0 1.0 1.0
5 1.0 1.0 1.0 1.0 1.0