pandas笔记(二)-- 从不订购的顾客 (数据表连接,主键与外键)

题目描述

找出所有从不点任何东西的顾客,以任意顺序返回结果

测试用例

输入

  • 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"})
posted @ 2024-03-06 17:28  KevinScott0582  阅读(8)  评论(0编辑  收藏  举报