最近在处理数据的时候遇到一个需求,核心就是求取最大连续行为天数

这里用北京空气质量数据作为案例进行演示,需求是找出北京空气质量连续污染最长持续多久并确定其周期。

图1:案例数据

以上图中数据来算,可以看到从1月21日-1月26日空气质量连续污染持续了6天。

不过,在实际的数据处理中,原始数据往往会较大,并不一定能直接看出来。接下来,介绍几种解决方案供大家参考。

1. 获取案例数据

大家可以通过以下方式获取案例数据。

import akshare as akair_quality_hist_df = ak.air_quality_hist(city="北京", period="day", start_date="2021-01-01", end_date="2021-04-26")
air_quality_hist_df.head()

图2:akshare数据预览

由于只需要用到aqi,并按照国际标准进行优良与污染定级,这里简单做下数据处理如下:

import pandas as pd# 重置索引
aqi = air_quality_hist_df['aqi'].reset_index()
# 将aqi列改为int类型
aqi.aqi = aqi.aqi.astype('int')
# 使用分箱进行空气质量定级
aqi['空气质量'] = pd.cut(aqi.aqi,bins=[0,100,500],labels=['优良','污染'])
# 取10个样本预览
aqi.sample(10)

图3:处理后数据

2. 求连续污染持续天数

2.1. 思路1:按时间排序求差值再分组计数

才哥上次的解法就是这种思路,回看当初的代码显得比较稚嫩,今天我们看看小明哥的解法,非常精彩。

步骤1:筛选空气质量为污染的数据

t = aqi.query('空气质量=="污染"')
t.sample(5)

图4:筛选空气质量污染的数据

步骤2:新增辅助列(辅助列可以不用加到原数据t上)

这里的逻辑大概如下:

  • 辅助排名列(按照时间顺序排序)为间隔天数

  • 然后用时间字段(time)与间隔天数求差值得到一个日期

  • 如果得到的这个日期相同,则这几天是连续污染天

groupids = pd.to_datetime(aqi.time)-pd.to_timedelta(aqi.time.rank(),unit='d')
groupids.sample(5)

图5:辅助列

步骤3:分组计数获得连续天数,分组求最小最大值获得连续 污染起止日期

t.groupby(groupids).agg({'time': lambda x:f'{x.min()}~{x.max()}', # 求起止日期'空气质量':"count", # 求连续天数
}).nlargest(5,'空气质量') # 取 空气质量 字段最大的前5组数据

图6:解法1的结果

以上完整代码如下:

t = aqi.query('空气质量=="污染"')
t.groupby(pd.to_datetime(t.time)-pd.to_timedelta(t.time.rank(),unit='d')).agg({'time': lambda x:f'{x.min()}~{x.max()}','空气质量':"count",}
).nlargest(5,'空气质量')

2.2. 思路2:比对相邻两天空气质量标记

思路2有两种解法,其一是利用循环创建辅助列,其二是利用shift和cumsum创建辅助列,具体我们可以往下看。

解法1:利用循环创建辅助列

  • 创建一个辅助列,辅助列的值按照以下思路创建函数获取

  • 如果空气质量为优良,则辅助列值+1;若当前空气质量和上一日不同,则辅助列值也+1

  • 以上均不满足,则辅助列值不变

last = None
num = 0
groupids = []
for v in aqi.空气质量.values:if v != last or v != '污染':num += 1groupids.append(num)last = v

根据这个逻辑可以得到辅助列数据如下:

图7:辅助列值预览

可以发现,按照辅助列分组进行计数即可获得连续污染天数,如上红色标记区域。

aqi.groupby(groupids).agg({'time': lambda x:f'{x.min()}~{x.max()}','空气质量':"count",}
).nlargest(5,'空气质量')

图8:思路2的解法1结果

解法2:利用shift和cumsum创建辅助列

  • 先创建空气质量的shift列,下移动一位

  • 如果shift列和空气质量列相等,则判断列为0,否则为1

  • 辅助列为判断列累加求和

图9:辅助列创建思路预览

我们也可以发现,按照辅助列分组计数即可获取空气质量连续天数(优良和污染均可),如上红色区域。

(aqi.query('空气质量=="污染"') # 这里筛选 污染 天气.groupby((aqi.空气质量.shift() != aqi.空气质量).cumsum()) # 辅助列.time.agg(['count','min','max']) # 计数及获取日期区间.nlargest(5,'count')
)

图9:思路2的解法2结果

按照小明哥的输出结果,调整代码如下:

(    aqi.query("空气质量=='污染'")    .groupby((aqi.空气质量 != aqi.空气质量.shift()).cumsum())    .agg(    {        'time': lambda x: f"{x.min()}~{x.max()}",         '空气质量': "count"}    ).nlargest(5, '空气质量'))

图10:思路2的解法2小明哥结果

以上就是本次全部内容,其实我们在日常工作生活中还可能遇到类似场景如:计算用户连续登录天数计算用户连续付费天数计算南方梅雨季节连续下雨天数等等!

Python应用实战-Pandas 计算连续行为天数的几种思路相关推荐

  1. Python金融实战之计算VaR

    总的来说,VaR的评估方式有参数法.非参数法.混合法(也叫半参数法) 一.历史模拟法(非参数法)计算VaR 1.VaR 定义:Value at Risk,在一定概率水平(置信度)下,某一金融资产或证券 ...

  2. Python应用实战-pandas绘制图形

    可视化是用来探索性数据分析最强大的工具之一.Pandas库包含基本的绘图功能,可以让你创建各种绘图.Pandas中的绘图是在matplotlib之上构建的,如果你很熟悉matplotlib你会惊奇地发 ...

  3. mysql 连续日期统计_MYSQL -- 计算连续日期天数

    一.题目 -- 查询产品出现连续订单情况 二.数据 -- 自建表名:test,字段名:goodid(产品id),date(日期) 三.解题思路 1.观察发现,产品a有连续4天,产品b有一个3天,一个4 ...

  4. python计算十年平均录取率_如何在Python中使用Pandas计算多年平均值

    首先,根据Pandas时间戳创建一个列:df = df.dropna() df['date'] = df.apply(lambda x: pd.Timestamp('{year}-{month}-{d ...

  5. SQL计算连续登陆天数大于等于3天的用户

    其中给出了用户(id)和用户登陆时间(dt)两列 其中要处理把登陆时间截取到日,然后根据id和登陆时间dt进行去重,然后得到如下的数据集 再进行下面的代码 select id, sdate, edat ...

  6. 666,Python竟然还可以计算农历!

    最近处理工作任务的时候遇到了转换农历的问题.一开始我打算搜索在线处理的网站或者转换的接口,结果找到了一个Python库可以直接解决,今天正好同大家分享一下. 农历,是我国现行的传统历法.它是根据月相的 ...

  7. mysql 连续签到天数_签到功能实现,没有你想的那么复杂(一)

    1 签到定义以及作用签到,指在规定的簿册上签名或写一"到"字,表示本人已经到达.在APP中使用此功能,可以增加用户粘性和活跃度.2 技术选型redis为主写入查询,mysql辅助查 ...

  8. Python数据分析实战基础 | 初识Pandas

    这是Python数据分析实战基础的第一篇内容,主要是和Pandas来个简单的邂逅.已经熟练掌握Pandas的同学,可以加快手速滑动浏览或者直接略过本文. 01  重要的前言 这段时间和一些做数据分析的 ...

  9. pandas 更改单元格的值_懂Excel轻松入门Python数据分析包pandas(二十四):连续区域...

    此系列文章收录在公众号中:数据大宇宙 > 数据处理 >E-pd 转发本文并私信我"python",即可获得Python资料以及更多系列文章(持续更新的) 经常听别人说 ...

最新文章

  1. linux调试C++错误: 程序中有游离的‘\240’‘\302’
  2. python_day16_pythom-mysql-API
  3. mysql 多线程 一致性_常见缓存数据库一致性方案(建议收藏)
  4. Make sure the device specification refers to a valid device
  5. 2038: [2009国家集训队]小Z的袜子(hose)+莫队入门
  6. Nginx多域名多Server反向代理配置
  7. 朱邦芬院士:我所熟悉的几位中国物理学大师的为人之本
  8. 使用Arrays sort 方法進行排序
  9. C++新特性探究(18.2):C++11 unique_ptr智能指针详解
  10. 计算机组成一简化模型
  11. 算法面试_怎么简单高效的理解递归?//TODO
  12. 【5G会话管理】UE IPv6地址的分配(SLAAC协议)
  13. 载入java VM时windows出现错误:2 的解决方法
  14. Python爬虫进行Web数据挖掘总结和分析
  15. 苹果商店打不开怎么办_苹果手机下载迅雷方法,iOS迅雷安装,怎么安装苹果版迅雷...
  16. java tracert_tracert详解
  17. 使用WPS后安装Office文档图标显示异常
  18. python 从菜鸟到高手 .pdf 下载_Python从菜鸟到高手pdf
  19. 阳光小小美女--我们都需要一个阳光积极的人生
  20. petalinux编译制作linux系统

热门文章

  1. 工业交换机和商用交换机对比
  2. 【渝粤题库】广东开放大学 市场营销 形成性考核
  3. qt 加载rtsp流_qt_ffmpeg_rtsp 在QT中拉取RTSP视频流并用FFMPEG解码播放 - 下载 - 搜珍网...
  4. webpack 异步加载配置文件_详解webpack异步加载业务模块
  5. matlab 大于并且小于,Matlab:将大于(小于)1(-1)的元素转换为1(-1)的序列
  6. php封装的数据库操作文件夹,PHP中对数据库操作的封装_php
  7. matlab 球坐标绘图,MATLAB绘制地图
  8. mysql中lead_SqlServer2012中LEAD函数简单分析_MySQL
  9. gilab无法解析php文件,gitlab重新设置域名后就无法访问了。
  10. java wrap方法_Java WritableCellFormat.setWrap方法代码示例