- 学习:知识的初次邂逅
- 复习:知识的温故知新
- 练习:知识的实践应用
经典案例 分组求top1
目录
一,原题力扣链接
二,题干
表:
Customers
+---------------+---------+ | Column Name | Type | +---------------+---------+ | customer_id | int | | name | varchar | +---------------+---------+ customer_id 是该表主键. 该表包含消费者的信息.表:
Orders
+---------------+---------+ | Column Name | Type | +---------------+---------+ | order_id | int | | order_date | date | | customer_id | int | | product_id | int | +---------------+---------+ order_id 是该表主键. 该表包含消费者customer_id产生的订单. 不会有商品被相同的用户在一天内下单超过一次.表:
Products
+---------------+---------+ | Column Name | Type | +---------------+---------+ | product_id | int | | product_name | varchar | | price | int | +---------------+---------+ product_id 是该表主键. 该表包含所有商品的信息.写一个解决方案, 找到每件商品的最新订单(可能有多个).
返回的结果以
product_name
升序排列, 如果有排序相同, 再以product_id
升序排列. 如果还有排序相同, 再以order_id
升序排列.查询结果格式如下例所示。
示例 1:
输入:Customers表:
+-------------+-----------+ | customer_id | name | +-------------+-----------+ | 1 | Winston | | 2 | Jonathan | | 3 | Annabelle | | 4 | Marwan | | 5 | Khaled | +-------------+-----------+Orders表:
+----------+------------+-------------+------------+ | order_id | order_date | customer_id | product_id | +----------+------------+-------------+------------+ | 1 | 2020-07-31 | 1 | 1 | | 2 | 2020-07-30 | 2 | 2 | | 3 | 2020-08-29 | 3 | 3 | | 4 | 2020-07-29 | 4 | 1 | | 5 | 2020-06-10 | 1 | 2 | | 6 | 2020-08-01 | 2 | 1 | | 7 | 2020-08-01 | 3 | 1 | | 8 | 2020-08-03 | 1 | 2 | | 9 | 2020-08-07 | 2 | 3 | | 10 | 2020-07-15 | 1 | 2 | +----------+------------+-------------+------------+Products表:
+------------+--------------+-------+ | product_id | product_name | price | +------------+--------------+-------+ | 1 | keyboard | 120 | | 2 | mouse | 80 | | 3 | screen | 600 | | 4 | hard disk | 450 | +------------+--------------+-------+ 输出: +--------------+------------+----------+------------+ | product_name | product_id | order_id | order_date | +--------------+------------+----------+------------+ | keyboard | 1 | 6 | 2020-08-01 | | keyboard | 1 | 7 | 2020-08-01 | | mouse | 2 | 8 | 2020-08-03 | | screen | 3 | 3 | 2020-08-29 | +--------------+------------+----------+------------+ 解释: keyboard 的最新订单在2020-08-01, 在这天有两次下单. mouse 的最新订单在2020-08-03, 在这天只有一次下单. screen 的最新订单在2020-08-29, 在这天只有一次下单. hard disk 没有被下单, 我们不把它包含在结果表中.
三,建表语句
import pandas as pd
data = [[1, 'Winston'], [2, 'Jonathan'], [3, 'Annabelle'], [4, 'Marwan'], [5, 'Khaled']]
customers = pd.DataFrame(data, columns=['customer_id', 'name']).astype({'customer_id':'Int64', 'name':'object'})
data = [[1, '2020-07-31', 1, 1], [2, '2020-7-30', 2, 2], [3, '2020-08-29', 3, 3], [4, '2020-07-29', 4, 1], [5, '2020-06-10', 1, 2], [6, '2020-08-01', 2, 1], [7, '2020-08-01', 3, 1], [8, '2020-08-03', 1, 2], [9, '2020-08-07', 2, 3], [10, '2020-07-15', 1, 2]]
orders = pd.DataFrame(data, columns=['order_id', 'order_date', 'customer_id', 'product_id']).astype({'order_id':'Int64', 'order_date':'datetime64[ns]', 'customer_id':'Int64', 'product_id':'Int64'})
data = [[1, 'keyboard', 120], [2, 'mouse', 80], [3, 'screen', 600], [4, 'hard disk', 450]]
products = pd.DataFrame(data, columns=['product_id', 'product_name', 'price']).astype({'product_id':'Int64', 'product_name':'object', 'price':'Int64'})
四,分析
题解:
表1:客户表
字段:客户姓名 客户id
表二 订单表
字段:订单id 订购日期,客户id,产品id
表上 产品表
字段:产品id,产品姓名,价格
求:每件商品的最新将订单 考虑并列 并且按照要求排序
第一步: 内连接 订单表和产品表
df = pd.merge(orders,products,how='inner',on='product_id') #内连接合并两个表
df
第二步,经典案例 分组求top1
df = pd.merge(orders,products,how='inner',on='product_id') #内连接合并两个表
df['rn'] = df.groupby('product_id')['order_date'].rank(method='min', ascending=False)
df
第三步,取并列第一的 行 然后选取指定的列 最后按照要求排序即可
五,Pandas解答
df3
#%%
import pandas as pd
def most_recent_orders(customers: pd.DataFrame, orders: pd.DataFrame, products: pd.DataFrame) -> pd.DataFrame:
df = pd.merge(orders,products,how='inner',on='product_id') #内连接合并两个表
df['rn'] = df.groupby('product_id')['order_date'].rank(method='min', ascending=False)
df1 = df[df['rn']==1]
df2 = df1.sort_values(['product_name','product_id','order_id'],ascending=[True,True,True])
df3 = df2[['product_name','product_id','order_id','order_date']]
return df3
六,验证
七,知识点总结
- Pandas内连接的运用 API :merge
- Pandas分组求top1 考虑并列的运用 API:gruoupby .... rank... method...ascending
- Pandas排序的运用 API:sort_values
- Pandas的综合运用 解经典案例 分组求top1(考虑并列)
- 学习:知识的初次邂逅
- 复习:知识的温故知新
- 练习:知识的实践应用