首页 > 编程语言 >8,(经典面试题:分组求topN)Python数分之Pandas训练,力扣,1532. 最近的三笔订单

8,(经典面试题:分组求topN)Python数分之Pandas训练,力扣,1532. 最近的三笔订单

时间:2024-09-27 18:21:06浏览次数:10  
标签:customer 面试题 07 08 三笔 order 2020 数分 id

  • 学习:知识的初次邂逅
  • 复习:知识的温故知新
  • 练习:知识的实践应用

目录

一,原题力扣链接

二,题干

三,建表语句

四,分析

五,Pandas解答

六,验证

七,知识点总结


一,原题力扣链接

. - 力扣(LeetCode)

二,题干

表: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

相关文章

  • 26,【经典大厂面试题】【连续问题的困难题】Python数分之Pandas训练,力扣,2173. 最多连胜
    学习:知识的初次邂逅复习:知识的温故知新练习:知识的实践应用目录一,原题力扣链接二,题干三,建表语句四,分析五,SQL解答六,验证七,知识点总结一,原题力扣链接.-力扣(LeetCode)二,题干表: Matches+-------------+------+|ColumnName|Type|+-------------+-----......
  • 【Kubernetes】常见面试题汇总(四十二)
    目录96.Kubernetes体系结构有哪些不同的组成部分?97.您能否简要介绍一下Kubernetes中主节点的工作?特别说明:题目  1-68  属于【Kubernetes】的常规概念题,即“汇总(一)~(二十二)”。题目69-113属于【Kubernetes】的生产应用题。96.Kubernetes体系结构有哪些......
  • 【Kubernetes】常见面试题汇总(四十一)
    目录94.iptables四个表五个链。95.Kubernetes如何简化容器化部署?特别说明:题目  1-68  属于【Kubernetes】的常规概念题,即“汇总(一)~(二十二)”。题目69-113属于【Kubernetes】的生产应用题。94.iptables四个表五个链。(1)iptables四个表:raw表:确定是否......
  • 【Kubernetes】常见面试题汇总(三十八)
    目录 91.Docker的网络通信模式。特别说明:题目  1-68  属于【Kubernetes】的常规概念题,即“汇总(一)~(二十二)”。题目69-113属于【Kubernetes】的生产应用题。91.Docker的网络通信模式。Docker的4种网络通信模式:1、host模式:-host模式,使用--net=ho......
  • 【Kubernetes】常见面试题汇总(三十五)
    目录 87.简述pod中readiness和liveness的区别和各自应用场景。特别说明:题目  1-68  属于【Kubernetes】的常规概念题,即“汇总(一)~(二十二)”。题目69-113属于【Kubernetes】的生产应用题。87.简述pod中readiness和liveness的区别和各自应用场景。......
  • 负载均衡--相关面试题(六)
    在负载均衡的面试中,可能会遇到一系列涉及概念、原理、实践应用以及技术细节的问题。以下是一些常见的负载均衡面试题及其详细解答:一、什么是负载均衡?回答:负载均衡是一种将网络请求或数据传输工作分配给多个服务器或网络资源的技术,旨在优化资源使用、提高吞吐量、减少响应时......
  • Redis常见面试题
    过期删除策略删除达到过期时间的key。1)定时删除对于每一个设置了过期时间的key都会创建一个定时器,一旦到达过期时间就立即删除。该策略可以立即清除过期的数据,对内存较友好,但是缺点是占用了大量的CPU资源去处理过期的数据,会影响Redis的吞吐量和响应时间。2)惰性删除当......
  • 【春秋招必看】Unity相关笔试面试题(内有完整答案)第五期
    欢迎来到光光的奇妙冒险,我是你们的煎饼光子老师。今天是我们的第五期笔试面试题总结。C#部分:1、以上代码,谁的效率更高?为什么?答案:代码2的效率更高因为List的本质是数组,在初始化时,如果不默认为其指明分配多少容量,它会不断扩容扩容会带来效率的降低和垃圾的产生效率的降......
  • 前端面试题(十)
    51.前端性能优化在前端开发中,性能优化是面试中的一个常见话题。面试官通常会希望候选人具备识别性能瓶颈并提出相应解决方案的能力。以下是一些常见的前端性能优化面试题及其答案。1.前端性能优化有哪些常见手段?前端性能优化的手段可以从多个维度考虑,主要包括:减少HT......
  • 并发编程面试题
    在java中守护线程和本地线程区别用户线程是程序创建的线程。由jvm创建的线程是守护线程,比方说垃圾收集线程。死锁与活锁的区别,死锁与饥饿的区别?死锁:是指两个或两个以上的进程(或线程)在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用,它们都将无法推进下......