- 学习:知识的初次邂逅
- 复习:知识的温故知新
- 练习:知识的实践应用
目录
一,原题力扣链接
二,题干
表:
Customers
+---------------+---------+ | Column Name | Type | +---------------+---------+ | customer_id | int | | name | varchar | +---------------+---------+ customer_id 是该表具有唯一值的列 该表包含消费者的信息表:
Orders
+---------------+---------+ | Column Name | Type | +---------------+---------+ | order_id | int | | order_date | date | | customer_id | int | | cost | int | +---------------+---------+ order_id 是该表具有唯一值的列 该表包含 id 为 customer_id 的消费者的订单信息 每一个消费者 每天一笔订单写一个解决方案,找到每个用户的最近三笔订单。如果用户的订单少于 3 笔,则返回他的全部订单。
返回的结果按照
customer_name
升序 排列。如果有相同的排名,则按照customer_id
升序 排列。如果排名还有相同,则按照order_date
降序 排列。结果格式如下例所示:
示例 1:
输入:Customers
+-------------+-----------+ | customer_id | name | +-------------+-----------+ | 1 | Winston | | 2 | Jonathan | | 3 | Annabelle | | 4 | Marwan | | 5 | Khaled | +-------------+-----------+Orders
+----------+------------+-------------+------+ | order_id | order_date | customer_id | cost | +----------+------------+-------------+------+ | 1 | 2020-07-31 | 1 | 30 | | 2 | 2020-07-30 | 2 | 40 | | 3 | 2020-07-31 | 3 | 70 | | 4 | 2020-07-29 | 4 | 100 | | 5 | 2020-06-10 | 1 | 1010 | | 6 | 2020-08-01 | 2 | 102 | | 7 | 2020-08-01 | 3 | 111 | | 8 | 2020-08-03 | 1 | 99 | | 9 | 2020-08-07 | 2 | 32 | | 10 | 2020-07-15 | 1 | 2 | +----------+------------+-------------+------+ 输出: +---------------+-------------+----------+------------+ | customer_name | customer_id | order_id | order_date | +---------------+-------------+----------+------------+ | Annabelle | 3 | 7 | 2020-08-01 | | Annabelle | 3 | 3 | 2020-07-31 | | Jonathan | 2 | 9 | 2020-08-07 | | Jonathan | 2 | 6 | 2020-08-01 | | Jonathan | 2 | 2 | 2020-07-30 | | Marwan | 4 | 4 | 2020-07-29 | | Winston | 1 | 8 | 2020-08-03 | | Winston | 1 | 1 | 2020-07-31 | | Winston | 1 | 10 | 2020-07-15 | +---------------+-------------+----------+------------+ 解释: Winston 有 4 笔订单, 排除了 "2020-06-10" 的订单, 因为它是最老的订单。 Annabelle 只有 2 笔订单, 全部返回。 Jonathan 恰好有 3 笔订单。 Marwan 只有 1 笔订单。 结果表我们按照 customer_name 升序排列,customer_id 升序排列,order_date 降序排列。进阶:
- 你能写出最近
n
笔订单的通用解决方案吗?- 回答: 是可以的 把我下面的解题中的 3换成变量n就可以了=.=
三,建表语句
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, 30], [2, '2020-7-30', 2, 40], [3, '2020-07-31', 3, 70], [4, '2020-07-29', 4, 100], [5, '2020-06-10', 1, 1010], [6, '2020-08-01', 2, 102], [7, '2020-08-01', 3, 111], [8, '2020-08-03', 1, 99], [9, '2020-08-07', 2, 32], [10, '2020-07-15', 1, 2]]
orders = pd.DataFrame(data, columns=['order_id', 'order_date', 'customer_id', 'cost']).astype({'order_id':'Int64', 'order_date':'datetime64[ns]', 'customer_id':'Int64', 'cost':'Int64'})
四,分析
题解:
表一:客户表
字段:客户id,客户姓名
表二:订单表
字段:订单id,订购日期,客户id,订购价格
求:找到每个用户最近的三笔订单 不足3个订单也显示,并且按照要求完成排序
第一步合并两个表: 内连接的方式
第二步,以用户分组,以订单时间排序 拿到序列
第三步,过滤取大于3的 并且按照指定要求排序,映射指定的列
五,Pandas解答
import pandas as pd
def recent_three_orders(customers: pd.DataFrame, orders: pd.DataFrame) -> pd.DataFrame:
df = pd.merge(customers,orders,how='inner',on='customer_id')
df['rn'] = df.groupby('customer_id')['order_date'].rank(method='first',ascending=False)
df1 = df[df['rn']<=3]
df2 = df1[['name','customer_id','order_id','order_date']]
df2.columns=['customer_name','customer_id','order_id','order_date']
df3 = df2.sort_values(['customer_name','customer_id','order_date'],ascending=[True,True,False])
return df3
六,验证
七,知识点总结
- Pandas内连接的运用 API:merge
- Pandas分组排序的运用 API:groupby...rank....ascending
- Pandas过滤的运用
- Pandas改名的运用
- Pandas排序的运用 API:sort_values
- python函数的运用
- 经典题目 分组求topN
标签:customer,面试题,07,08,三笔,order,2020,数分,id From: https://blog.csdn.net/qq_55006020/article/details/142442236
- 学习:知识的初次邂逅
- 复习:知识的温故知新
- 练习:知识的实践应用