当前位置: 首页 > news >正文

[每日一练]按日期分组销售产品的最优解法

该题目来自于力扣的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 pddef 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()转换为时间类型。但在我们面对大型数据时,还是建议提前对时间类进行清洗。

http://www.lryc.cn/news/357750.html

相关文章:

  • 免费wordpress中文主题
  • 单链表经典算法题理解
  • STM32的时钟介绍
  • FindBI学习总结
  • k8s——Pod详解
  • Visual Studio 的调试
  • mysql语句大全及用法
  • 如何找出真正的交易信号?Anzo Capital昂首资本总结7个
  • JavaScript-内存分配
  • 理论知识.质数打表
  • FFMPEG+ANativeWinodow渲染播放视频
  • 使用AXI MIG/Proc Sys Reset
  • Android基础-Kotlin语言的作用及优缺点
  • 手机投屏技巧:手机怎么投屏到电脑显示屏上?精选6招解决!
  • 内存函数<C语言>
  • 华为校招机试 - LRU模拟(20240515)
  • AI预测福彩3D采取888=3策略+和值012路一缩定乾坤测试5月29日预测第5弹
  • 03_前端三大件CSS
  • 十种常用数据分析模型
  • salesforce 公式字段 判断一个字段是否在某个多选列表中
  • C++STL容器系列(三)list的详细用法和底层实现
  • IEEE Latex模版踩雷避坑指南
  • 【C++】类与对象——多态详解
  • WordPress建网站公司 建易WordPress建站
  • MySQL正则替换整个单词
  • Java设计模式:享元模式实现高效对象共享与内存优化(十一)
  • 景源畅信电商:抖音开店步骤是什么?
  • Notepad++不显示CRLF的方法
  • 前端开发工程师——AngularJS
  • 【AI算法岗面试八股面经【超全整理】——概率论】