首页 > 其他分享 >[每日一练]按日期分组销售产品的最优解法

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

时间:2024-05-29 19:00:53浏览次数:41  
标签:sell 06 函数 2020 date 分组 最优 解法

该题目来自于力扣的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

相关文章

  • 文件轻松按数量分组,管理更灵活便捷!
    在网络信息数据中,文件是我们知识的宝藏,也是我们工作的伙伴,陪伴着我们向前。可是,当这些文件数量繁多时,曾经的管理方法便显露出了不足,耗时长效率低等等一系列的问题,让我们难以有效地管理和利用这些宝贵的资源。面对这些问题,小编有一个方案可以让我们快速、准确、有效的进行管理,接......
  • 分组数据
    指定分组后,对每个分组里的数据进行聚集selectvend_id,count(*)asnum_prodsfromproductsgroupbyvend_id;过滤分组selectcust_id,count(*)fromordersgroupbycust_idhavingcount(*)>=2;注意:where是在分组前进行过滤,having是在分组后进行过滤价格>......
  • 【三变量联合分布函数copula】利用AIC BIC确定单变量最优拟合函数、利用AIC确定三变量
      ......
  • 从CF1660F2看同余分组
    https://codeforces.com/contest/1660/problem/F2同余分组,树状数组维护逆序对先承继F1的做法,维护一个前缀和数组,让s[i]=='+'为\(1\),s[i]=='-'为\(-1\)。那么要满足两个条件:\(pre_r-pre_l\leq0\)要么加减号相同,要么减号更多(只有减号能减少)\(pre_r-pre_l......
  • leedcode【349】. 两个数组的交集——Java解法
    Problem: 349.两个数组的交集题目思路解题方法复杂度Code效果题目给定两个数组nums1和nums2,返回它们的交集。输出结果中的每个元素一定是唯一的。我们可以不考虑输出结果的顺序。示例1:输入:nums1=[1,2,2,1],nums2=[2,2]输出:[2]示例2:输入:nums1=[......
  • leedcode【383】. 赎金信——Java解法
    Problem: 383.赎金信题目思路解题方法复杂度Code性能题目给你两个字符串:ransomNote和magazine,判断ransomNote能不能由magazine里面的字符构成。如果可以,返回true;否则返回false。magazine中的每个字符只能在ransomNote中使用一次。示例1:输入:ransomNot......
  • 如何安全地进行隔离网文件导出,最优方案出炉!
    越来越多的企业在网络建设时进行网络隔离,通常与提高安全性和控制风险有关。但网络隔离后,企业仍存在与外部客户、合作伙伴等数据交换的场景需求,即如何安全进行隔离网文件导出,是企业急需解决的一个难题。先来看一下,企业通常会采取哪些隔离方式吧?1、网闸/光闸隔离:阻断网络通信协议,......
  • java list分组并对bigdecimal属性求和
    JavaList分组并对BigDecimal属性求和在Java中,我们经常需要对一个List进行分组,并对其中的BigDecimal属性进行求和操作。这种需求在实际项目中非常常见,比如在处理财务数据、统计数据等场景中。本文将介绍如何使用Java来实现这一功能,同时会提供代码示例来帮助读者更好地理解。1.使......
  • 2831. 找出最长等值子数组力扣解法和辅助图
    题目描述:给你一个下标从0开始的整数数组nums和一个整数k。如果子数组中所有元素都相等,则认为子数组是一个等值子数组。注意,空数组是等值子数组。从nums中删除最多k个元素后,返回可能的最长等值子数组的长度。子数组是数组中一个连续且可能为空的元素序列......
  • CSP历年复赛题-P1094 [NOIP2007 普及组] 纪念品分组
    原题链接:https://www.luogu.com.cn/problem/P1094题意解读:贪心选择解题思路:贪心策略:将纪念品按价格由小到大排序,优先一大、一小,如果价格之和不超限,则分为一组,如果超限,则大的单独分为一组,重复以上过程,直到所有数据都遍历到,采用一头一尾双指针即可。证明:如果最大价格不是和最......