一个真实问题,搞定三个冷门pandas函数
↑ 关注 + 星标 ,每天学Python新技能
后台回复【大礼包】送你Python自学大礼
最近有一个粉丝问过我一个问题,觉得挺有意思,分享给大家。经过简化后大概就是有一个长这样的时间序列数据?
可以看到,一共有15行数据,其中有一些行的value
是空值, 现在想在不改变原数据的情况下取出从第一个不是空值的行之后的全部数据?
嗯,看上去不是很难,但如果添加一个额外要求:「使用纯pandas函数完成」 这就涉及到了一些不常用的函数,一起来看看。
首先需要构造这样的数据,在Python中我们可以先按照规则生成字符串,然后使用time
或datatime
模块进行转换,方法很多,但是pandas中如何直接生成呢?这就涉及到第一个函数date_range
。
pd.date_range
其实在pandas中生成时间序列数据比其他方法要方便很多,使用.date_range
一行代码即可,该函数使用方法为
pandas.date_range(start=None, end=None, periods=None, freq=None, tz=None, normalize=False, name=None, closed=None, **kwargs)
可以通过起止日期来生成
也可以通过开始日期与长度生成
上面的默认间隔是1天,当然是可以自定义,比如修改为5天
该方法还支持生成更多的指定形式的时间序列数据,感兴趣的读者可以自行查阅官方文档,现在我们就可以生成示例数据?
df = pd.DataFrame(
{ 'date': [i for i in pd.date_range('20200701','20200715')],
'value': ['','','','','',1,6,1,2,'',2,1,6,0,1]}
)
接下来我的思路是
- 判断value列的每个值是否为空值,返回
Ture/False
- 找到第一个为False的索引,取后面全部的数据
为了只用pandas实现这个思路,用到了两个不常见的函数,让我们慢慢说。
pandas.Series.ne
ne函数可以比较两个Series,常用于缺失值填充,下面是一个例子
除了可以比较两个Series之外,对于我们的问题,它可以比较元素:返回True如果这个值不是你指定的值,听上去很绕,我们看代码
可以看到,所有空值都被标记为False,接下来要做的就是找到第一个True元素的索引,并取出之后的全部数据。
pandas.DataFrame.idxmax
如何在pandas中直接定位一组数据中最大/最小值的位置?可以使用idxmax/idxmin
,这个函数不难,直接看一个简单的例子
它可以返回最大值/最小值第一次出现的位置索引!刚好可以满足我们的要求,现在就可以将idxmax
与之前的ne
函数结合起来实现我们需求
df['value'].ne('').idxmax()
# 5
返回的索引值是5,最后就可以使用loc
函数一行代码实现我们的需求
其实这个问题还有很多其他的办法,比如可以先筛选出所有True的索引,然后使用.first_valid_index()
找到第一个True,最后也可以不用loc直接df[df['value'].ne('')]
实现。
但我还希望你能掌握上面三个函数并灵活运用,如果有更好的思路可以在评论区留言。
-END-
送一份学习资料60多本电子书
扫码回复「1024」后获取大礼包
推荐阅读
重磅消息!谷歌或将被迫卖掉Chrome浏览器,未来由谁接盘?
把 14 亿人拉到一个微信群,如何实现?
人工智能新手入门的学习路径与资料,免费给到你
扫码回复「大礼包」后获取大礼
- RSA简介(二)——模幂算法
- 为虚拟机vCPU绑定物理CPU
- RSA简介(三)——寻找质数
- RSA简介(四)——求逆算法
- 平方根的C语言实现(三) ——最终程序实现
- ASP.NET Core应用的错误处理[3]:ExceptionHandlerMiddleware中间件如何呈现“定制化错误页面”
- 【视频】Es6新特性-Symbol
- shell编程/字库裁剪(3)——验证
- 特征选择(Feature Selection)引言
- shell编程/字库裁剪(2)——编程过程
- 使用mock来编译和管理RPM软件包
- C语言/原子/编译,你真的明白了吗?
- ASP.NET Core应用的错误处理[4]:StatusCodePagesMiddleware中间件如何针对响应码呈现错误页面
- 用sed实现wc -w的功能
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 【DB宝20】在Docker中分分钟即可拥有OGG Director环境
- mq监听死信队列后如何处理
- 【小白学PyTorch】7 最新版本torchvision.transforms常用API翻译与讲解
- 小白学PyTorch | 8 实战之MNIST小试牛刀
- 干货:用好VSCode这13款插件和8个快捷键,工作效率提升10倍
- 使用dplyr包对表格整理
- 安利 5 个拍案叫绝的 Matplotlib 骚操作!
- 多媒体程序开发
- 本地 IDE 已废!编辑器大结局!GitHub 的云 VSCode 实测
- 实战 | Python 编写端口扫描器
- 我这几年踩过的十个坑,每一条都是血泪教训
- 在 Python 中如何快速创建一个只读字典?
- 现场打脸:如何使用Selenium批量上传文件?
- 一日一技:FastAPI如何关闭接口文档?
- 什么叫做类比,为什么有些 Python 入门教程结构不合理?