- 学习:知识的初次邂逅
- 复习:知识的温故知新
- 练习:知识的实践应用
目录
一,原题力扣链接
二,题干
表:
Sales
+--------------+---------+ | Column Name | Type | +--------------+---------+ | sale_id | int | | product_name | varchar | | sale_date | date | +--------------+---------+ sale_id 是该表具有唯一值的列 该表的每一行包含了产品的名称及其销售日期因为在 2000 年该表是手工填写的,
product_name
可能包含前后空格,而且包含大小写。编写一个解决方案报告每个月的销售情况:
product_name
是小写字母且不包含前后空格sale_date
格式为('YYYY-MM')
total
是产品在本月销售的次数返回结果以
product_name
升序 排列,如果有排名相同,再以sale_date
升序 排列。查询结果格式如下所示。
示例 1:
输入: Sales
表: +---------+--------------+------------+ | sale_id | product_name | sale_date | +---------+--------------+------------+ | 1 | LCPHONE | 2000-01-16 | | 2 | LCPhone | 2000-01-17 | | 3 | LcPhOnE | 2000-02-18 | | 4 | LCKeyCHAiN | 2000-02-19 | | 5 | LCKeyChain | 2000-02-28 | | 6 | Matryoshka | 2000-03-31 | +---------+--------------+------------+ 输出: +--------------+-----------+-------+ | product_name | sale_date | total | +--------------+-----------+-------+ | lckeychain | 2000-02 | 2 | | lcphone | 2000-01 | 2 | | lcphone | 2000-02 | 1 | | matryoshka | 2000-03 | 1 | +--------------+-----------+-------+ 解释: 一月份售出 2 部 LcPhones。请注意,产品名称不区分大小写,且可能包含空格。 二月份售出 2 个 LCKeychains 和 1 部 LCPhone。 三月份售出 1 个 Matryoshka。
三,建表语句
import pandas as pd
data = [[1, 'LCPHONE', '2000-01-16'], [2, 'LCPhone', '2000-01-17'], [3, 'LcPhOnE', '2000-02-18'], [4, 'LCKeyCHAiN', '2000-02-19'], [5, 'LCKeyChain', '2000-02-28'], [6, 'Matryoshka', '2000-03-31']]
sales = pd.DataFrame(data, columns=['sale_id', 'product_name', 'sale_date']).astype({'sale_id':'Int64', 'product_name':'object', 'sale_date':'datetime64[ns]'})
四,分析
思路
表格大法
第一步:对产品名称列 去除左右两边空格 和转换为小写
第二步:对时间列截取 保留年和月
第三步:以产品名称,和时间列分组 count sale_id的数量
第四步:改名 排序 映射指定的列 输出
解题过程
MySQL+Pandas中实现上述表格逻辑
第一步:对产品名称列 去除左右两边空格 和转换为小写
在mysql
在pandas
第二步:对时间列截取 保留年和月
在mysql
在pandas
第三步:以产品名称,和时间列分组 count sale_id的数量
在mysql
在pandas 第四步:改名 排序 映射指定的列 输出
在mysql
在pandas
五,Pandas解答
import pandas as pd
def fix_name_format(sales: pd.DataFrame) -> pd.DataFrame:
# 去除前后空格 和转为小写 以及把日期切片
sales['product_name'] = sales['product_name'].str.strip().str.lower()
sales['sale_date'] = sales['sale_date'].astype(str).str[:7]
res = sales.groupby(['product_name','sale_date'])['sale_id'].count().reset_index(name='total')
return res.sort_values(['product_name','sale_date'],ascending=[True,True])
fix_name_format(sales)
六,验证
七,知识点总结
- Python中字符串去除左右两边空格的函数 strip()
- Python中把字符串转为小写的函数 lower()
- Pandas中把日期函数截取的函数 字符串的切片
- Pandas中分组聚合的运用
- Pandas中排序的运用
- Pandas中重置索引的运用 并且生成分组聚合的列名
- 学习:知识的初次邂逅
- 复习:知识的温故知新
- 练习:知识的实践应用