题目描述
找出所有从不点任何东西的顾客,以任意顺序返回结果
测试用例
输入
- Customers table:
id | name |
---|---|
1 | Joe |
2 | Henry |
3 | Sam |
4 | Max |
- Orders table:
id | customerId |
---|---|
1 | 3 |
2 | 1 |
输出
Customers |
---|
Henry |
Max |
解析
数据表连接的问题核心在于连接条件的编码实现, 这里先引入两个概念, 主键和外键
- 主键:用于保证数据的唯一性, 不能重复, 也不能为空, 例如身份证号, 学号等在数据表中通常被视为主键
- 外键:用于在表之间建立连接, 外键可以有重复的, 也可以存在空值
所谓连接条件,就是明确主键和外键之间的映射关系(有点集合论内味了)
一言以蔽之,找到列 table_A["主键"] 与 table_B["外键"], 此类问题便不难解决, 以本题为例:
不难看出,"id" 就是 Customer 表的主键,而 Orders 表中的 "customerId" 则作为 Customers 表中 "id" 的外键
显然,集合 Orders["customerID"] 是 Customers["id"] 的真子集,表示点单的顾客id,那么其差集便是我们
要找的征信名单(某种意义上是这样的)
到此,我们的问题就转化成了一个关于集合的计算问题:
先确定 Customers["id"] 与 Orders["customerId"] 的差集,即从不点任何东西的顾客id
据此从 Customers 表中返回对应的人名,注意此时返回的 Dataframe 列名仍为 name, 需要我们重命名为 Customers
代码如下:
import pandas as pd
def find_customers(customers: pd.DataFrame, orders: pd.DataFrame) -> pd.DataFrame:
df:pd.DataFrame = customers[~customers["id"].isin(orders["customerId"])]
return df[["name"]].rename(columns={"name": "Customers"})
标签:Customers,--,外键,id,数据表,pd,主键
From: https://www.cnblogs.com/KevinScott0582/p/18057071