41,Python数分之Pandas训练,力扣,1126. 查询活跃业务

  • 学习:知识的初次邂逅
  • 复习:知识的温故知新
  • 练习:知识的实践应用

目录

一,原题力扣链接

二,题干

三,建表语句

四,分析

五,Pandas解答

六,验证

七,知识点总结


一,原题力扣链接

. - 力扣(LeetCode)

二,题干

事件表:Events

+---------------+---------+
| Column Name   | Type    |
+---------------+---------+
| business_id   | int     |
| event_type    | varchar |
| occurrences   | int     | 
+---------------+---------+
(business_id, event_type) 是这个表的主键(具有唯一值的列的组合)。
表中的每一行记录了某种类型的事件在某些业务中多次发生的信息。

平均活动 是指有特定 event_type 的具有该事件的所有公司的 occurrences 的均值。

活跃业务 是指具有 多个 event_type 的业务,它们的 occurrences 严格大于 该事件的平均活动次数。

写一个解决方案,找到所有 活跃业务

以 任意顺序 返回结果表。

结果格式如下所示。

示例 1:

输入:
Events table:
+-------------+------------+-------------+
| business_id | event_type | occurrences |
+-------------+------------+-------------+
| 1           | reviews    | 7           |
| 3           | reviews    | 3           |
| 1           | ads        | 11          |
| 2           | ads        | 7           |
| 3           | ads        | 6           |
| 1           | page views | 3           |
| 2           | page views | 12          |
+-------------+------------+-------------+
输出:
+-------------+
| business_id |
+-------------+
| 1           |
+-------------+ 
解释:
每次活动的平均活动可计算如下:
- 'reviews': (7+3)/2 = 5
- 'ads': (11+7+6)/3 = 8
- 'page views': (3+12)/2 = 7.5
id=1 的业务有 7 个 'reviews' 事件(多于 5 个)和 11 个 'ads' 事件(多于 8 个),所以它是一个活跃的业务。

三,建表语句

import pandas as pd
data = [[1, 'reviews', 7], [3, 'reviews', 3], [1, 'ads', 11], [2, 'ads', 7], [3, 'ads', 6], [1, 'page_views', 3], [2, 'page_views', 12]]
events = pd.DataFrame(data, columns = ['business_id', 'event_type', 'occurences']).astype({'business_id':'Int64', 'event_type':'object', 'occurences':'Int64'})

四,分析

表格大法
第一步:开一新列,以事件类型分组,统计每个事件类型的平均值
第二步:过滤 掉活动次数小于平均的
第三步:以记录id分组 cnt记录id的数量 过滤出大于1的值 第四步:拿到记录id 并输出

解题过程

代码实现以上过程

第一步:开一新列,以事件类型分组,统计每个事件类型的平均值

在pandas

第二步:过滤 掉活动次数小于平均的

在pandas

第三步:以记录id分组 cnt记录id的数量 过滤出大于1的值

在pandas

第四步:拿到记录id 并输出

五,Pandas解答

import pandas as pd

def active_businesses(events: pd.DataFrame) -> pd.DataFrame:
    #取出各个类型的平均数
    events['avg_o'] = events.groupby('event_type')['occurences'].transform('mean')
    #过滤掉小于平均数的类型
    res = events[events['occurences']>events['avg_o']].reset_index()
    #以用户id分组 求用户id的数量
    res['cnt'] = res.groupby('business_id')['business_id'].transform('count')
    #过于掉小于1的
    res1 = res[res['cnt']>1]
    #拿到最终的结果 去重一下 转为df对象
    df = res1['business_id'].drop_duplicates().to_frame()
    return df
active_businesses(events)

六,验证

七,知识点总结

  • Pandas中模拟avg开窗的操作 API: groupby...transfrom
  • Pandas中条件过滤的运用
  • Pandas中重置索引的运用
  • Pandas中分组聚合大于运用 类似count开窗的运用
  • Pandas中去重的运用  API drop_duplicates
  • Pandas中把series对象转为dataframe对象的运用
  • Python函数的运用

  • 学习:知识的初次邂逅
  • 复习:知识的温故知新
  • 练习:知识的实践应用
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值