- 学习:知识的初次邂逅
- 复习:知识的温故知新
- 练习:知识的实践应用
目录
一,原题力扣链接
二,题干
表:
Users
+----------------+---------+ | Column Name | Type | +----------------+---------+ | user_id | int | | join_date | date | | favorite_brand | varchar | +----------------+---------+ user_id 是此表主键(具有唯一值的列)。 表中描述了购物网站的用户信息,用户可以在此网站上进行商品买卖。表:
Orders
+---------------+---------+ | Column Name | Type | +---------------+---------+ | order_id | int | | order_date | date | | item_id | int | | buyer_id | int | | seller_id | int | +---------------+---------+ order_id 是此表主键(具有唯一值的列)。 item_id 是 Items 表的外键(reference 列)。 (buyer_id,seller_id)是 User 表的外键。表:
Items
+---------------+---------+ | Column Name | Type | +---------------+---------+ | item_id | int | | item_brand | varchar | +---------------+---------+ item_id 是此表的主键(具有唯一值的列)。编写解决方案找出每个用户的注册日期和在
2019
年作为买家的订单总数。以 任意顺序 返回结果表。
查询结果格式如下。
示例 1:
输入: Users 表: +---------+------------+----------------+ | user_id | join_date | favorite_brand | +---------+------------+----------------+ | 1 | 2018-01-01 | Lenovo | | 2 | 2018-02-09 | Samsung | | 3 | 2018-01-19 | LG | | 4 | 2018-05-21 | HP | +---------+------------+----------------+ Orders 表: +----------+------------+---------+----------+-----------+ | order_id | order_date | item_id | buyer_id | seller_id | +----------+------------+---------+----------+-----------+ | 1 | 2019-08-01 | 4 | 1 | 2 | | 2 | 2018-08-02 | 2 | 1 | 3 | | 3 | 2019-08-03 | 3 | 2 | 3 | | 4 | 2018-08-04 | 1 | 4 | 2 | | 5 | 2018-08-04 | 1 | 3 | 4 | | 6 | 2019-08-05 | 2 | 2 | 4 | +----------+------------+---------+----------+-----------+ Items 表: +---------+------------+ | item_id | item_brand | +---------+------------+ | 1 | Samsung | | 2 | Lenovo | | 3 | LG | | 4 | HP | +---------+------------+ 输出: +-----------+------------+----------------+ | buyer_id | join_date | orders_in_2019 | +-----------+------------+----------------+ | 1 | 2018-01-01 | 1 | | 2 | 2018-02-09 | 2 | | 3 | 2018-01-19 | 0 | | 4 | 2018-05-21 | 0 | +-----------+------------+----------------+
三,建表语句
import pandas as pd
data = [[1, '2018-01-01', 'Lenovo'], [2, '2018-02-09', 'Samsung'], [3, '2018-01-19', 'LG'], [4, '2018-05-21', 'HP']]
users = pd.DataFrame(data, columns=['user_id', 'join_date', 'favorite_brand']).astype({'user_id':'Int64', 'join_date':'datetime64[ns]', 'favorite_brand':'object'})
data = [[1, '2019-08-01', 4, 1, 2], [2, '2018-08-02', 2, 1, 3], [3, '2019-08-03', 3, 2, 3], [4, '2018-08-04', 1, 4, 2], [5, '2018-08-04', 1, 3, 4], [6, '2019-08-05', 2, 2, 4]]
orders = pd.DataFrame(data, columns=['order_id', 'order_date', 'item_id', 'buyer_id', 'seller_id']).astype({'order_id':'Int64', 'order_date':'datetime64[ns]', 'item_id':'Int64', 'buyer_id':'Int64', 'seller_id':'Int64'})
data = [[1, 'Samsung'], [2, 'Lenovo'], [3, 'LG'], [4, 'HP']]
items = pd.DataFrame(data, columns=['item_id', 'item_brand']).astype({'item_id':'Int64', 'item_brand':'object'})
四,分析
思路
表格大法: 过滤2019年的订单,左连接2个表,以用户id分组 聚合订单数量,去重,改名,输出
第一步:过滤订单表(orders)中非2019年的订单行数;
第二步:以用户表 左连接订单表 连接条件 用户的id和订单表中的buyerid,左连接的原因,加入有的用户没有下单的呢?
第三步:开窗count 扩充一列 统计以每个用户的下单数量;
第四步:映射指定的列,去重(开窗之后必然有重复的列),改名,输出
解题过程
mysql+pandas代码分别实现上述表格的逻辑
第一步:过滤订单表(orders)中非2019年的订单行数;
在pandas
第二步:以用户表 左连接订单表 连接条件 用户的id和订单表中的buyerid,左连接的原因,加入有的用户没有下单的呢?
在pandas
第三步:开窗count 扩充一列 统计以每个用户的下单数量;
在pandas
第四步:映射指定的列,去重(开窗之后必然有重复的列),改名,输出
在pandas
五,Pandas解答
import pandas as pd
def market_analysis(users: pd.DataFrame, orders: pd.DataFrame, items: pd.DataFrame) -> pd.DataFrame:
# 拿到2019年的订单
df = orders[orders['order_date'].dt.year ==2019]
df1 = pd.merge(users,df,how='left',left_on='user_id',right_on='buyer_id')
#映射指定的列 类似sql中 count开窗求出每个用户的的下单数
df2 = df1[['user_id','join_date','order_id']]
df3 =df2.copy()
df3['cnt'] = df3.groupby('user_id')['order_id'].transform('count')
res = df3[['user_id','join_date','cnt']].drop_duplicates().reset_index(drop=True)
#| buyer_id | join_date | orders_in_2019 |
res.columns=['buyer_id','join_date','orders_in_2019']
return res
market_analysis(users,orders,items)
六,验证
七,知识点总结
- Pandas中时间行数的运用 dt.year
- Pandas中做左连接的运用 pd.merge
- Pandas中映射指定的列的运用
- Pnadas中copy的运用
- Pandas中 分组开窗的运用 实现类似sql中 count开窗的效果 transform
- Pandas中 去重的运用 drop_duplicates
- Pandas中 重置索引的运用 reset_index
- Pandas中 columns
- Python中函数的运用
- 学习:知识的初次邂逅
- 复习:知识的温故知新
- 练习:知识的实践应用