该题目来自于力扣的pandas题库,链接如下:
1484. 按日期分组销售产品 - 力扣(LeetCode)
题目要求:
表 Activities
:
+-------------+---------+ | 列名 | 类型 | +-------------+---------+ | sell_date | date | | product | varchar | +-------------+---------+ 该表没有主键(具有唯一值的列)。它可能包含重复项。 此表的每一行都包含产品名称和在市场上销售的日期。
编写解决方案找出每个日期、销售的不同产品的数量及其名称。
每个日期的销售产品名称应按词典序排列。
返回按 sell_date
排序的结果表。
结果表结果格式如下例所示。
示例 1:
输入:
Activities
表:
+------------+-------------+
| sell_date | product |
+------------+-------------+
| 2020-05-30 | Headphone |
| 2020-06-01 | Pencil |
| 2020-06-02 | Mask |
| 2020-05-30 | Basketball |
| 2020-06-01 | Bible |
| 2020-06-02 | Mask |
| 2020-05-30 | T-Shirt |
+------------+-------------+
输出:
+------------+----------+------------------------------+
| sell_date | num_sold | products |
+------------+----------+------------------------------+
| 2020-05-30 | 3 | Basketball,Headphone,T-shirt |
| 2020-06-01 | 2 | Bible,Pencil |
| 2020-06-02 | 1 | Mask |
+------------+----------+------------------------------+
解释:
对于2020-05-30,出售的物品是 (Headphone, Basketball, T-shirt),按词典序排列,并用逗号 ',' 分隔。
对于2020-06-01,出售的物品是 (Pencil, Bible),按词典序排列,并用逗号分隔。
对于2020-06-02,出售的物品是 (Mask),只需返回该物品名。
代码实现:
我本人能力有限,做出的答案执行效率太低,这里我们直接看官方的执行速度最快的代码吧。非原创。
import pandas as pd
def categorize_products(activities: pd.DataFrame) -> pd.DataFrame:
#这里使用特殊参数as_index不要让sell_date变为索引,省去了reset_index()的代码,对总体的数据进行分组
grouped_df = activities.groupby('sell_date',as_index=False)
#直接利用聚合函数来进行新列的建立
df = grouped_df.agg(num_sold=('product','nunique'),products=('product',lambda x:','.join(sorted(set(x)))))
return df.sort_values(by=['sell_date'])
这个代码主要在于groupby函数,agg函数,lambda函数的用法
代码及特殊参数解释:
--首先在对全体函数进行分组时,groupby函数使用了一个重要的参数
- as_index = True / False
代表是否把分组的键值设立为索引,默认是True。我们在之前编辑数据时,总是在分组聚合后使用reset_index()函数进行索引的重置,是因为分组聚合后的数据比较复杂,使用这个代码比较保险,而当对整个数据进行分组时,可以直接使用as_index参数,可以提高执行速度,精简代码。
--先进行分组在对数据进行聚合,这样做会将每个日期下的产品按照分组聚合到同一个格子里,但是同时保留了每个产品的信息。
--其次,在新建列并对数据进行编辑聚合时,可以直接使用agg聚合函数,方便且快捷。
- agg函数使用形式:
- agg(min_data=('sale_date',min),max_data=('sale_date',max)
- .agg({'A': 'sum', 'B': 'mean', 'C': 'max'})
这里我们使用第一个使用形式。
--关于lambda函数的强大的遍历效果
我们在聚合函数内建立了products列后,要把表格中的数据都分组放在一个空间力,并对它们进行去重和按照词典排序,数据很多,使用lambda函数可以很快的遍历求解
#代码
df = grouped_df.agg(products=('product',lambda x:','.join(sorted(set(x)))))
- lambda函数使用方法:
- [ 捕获列表 ] (参数) -> 返回类型 {}
对product列的每个数据之间加入“,”分隔,由于已经分好组了,所以直接给数据传入set函数来去重,传入sorted函数进行字母排序。
--额外思考:
这个代码对于时间列的使用仅仅是用来分组,所以不需要将该列通过:to_datetime()转换为时间类型。但在我们面对大型数据时,还是建议提前对时间类进行清洗。
标签:sell,06,函数,2020,date,分组,最优,解法 From: https://blog.csdn.net/2302_77975940/article/details/139302483