看过来
《pandas 教程》 持续更新中,提供建议、纠错、催更等加作者微信: gairuo123(备注:pandas教程)和关注公众号「盖若」ID: gairuo。跟作者学习,请进入 Python学习课程。欢迎关注作者出版的书籍:《深入浅出Pandas》 和 《Python之光》。
在数据的分析过程中对数据序列的变化趋势,是一个分析的重点,数据的连续变化情况是业务发展的关键指标,本需求中,我们需要在一个数列中,找出连续增加上升的部分数据。那么这个需求在 Pandas 中是如何来实现的,我们今天来做这样的一个案例。
数据集如下:
import pandas as pd
df = pd.DataFrame([3,4,3,2,3,5,7,6,3],
columns=['A'])
df
'''
A
0 3
1 4
2 3
3 2
4 3
5 5
6 7
7 6
8 3
'''
我们观察一下A列的数据,其中3,4(在索引0、1)是连续上升增加,3、5、6(在索引4、5、6),也是连续上升的其余部分是下降的,我们就是要把这些数据筛选出来。
我们观察一下上面的数列,连续增加的数据有一个特点,就是后面的数据比前面的数据大。针对这个特点,我们增加一个辅助列,这个辅助列是对应下一个数据只的差值。
有了前后差值序列之后,我们再判断这个差值是否大于零,大于零代表着前一个数据比后面的数据大,小于零则代表着前一个数据比后面的数据小。在本需求中,没有要求连续大于几个数据,那么我们就实现了至少连续大于一个。
最后将大于一的行筛选出来,就实现了最终的数据。
接下来根据上面的思路,我们来做一下代码实现。
# 首先增加一个差值辅助列
(
df.assign(B=df.A.diff(1))
)
'''
A B
0 3 NaN
1 4 1.0
2 3 -1.0
3 2 -1.0
4 3 1.0
5 5 2.0
6 7 2.0
7 6 -1.0
8 3 -3.0
'''
# 把缺失值填充为 1,然后作比较运算是否大于0
(
df.assign(B=df.A.diff(1).fillna(1)>0)
)
'''
A B
0 3 True
1 4 True
2 3 False
3 2 False
4 3 True
5 5 True
6 7 True
7 6 False
8 3 False
'''
# 最终筛选B列为真的
(
df.assign(B=df.A.diff(1).fillna(1)>0)
.query('B') # B 为真
)
'''
A B
0 3 True
1 4 True
4 3 True
5 5 True
6 7 True
'''
以上就得到了最终的结果。
在上边最终的结果中,我们发现一个问题,在结果数据中,索引 3 的值 2,作为第二次数据增加的开始并没有包含,有时候我们又需要包含这个增加起始的值怎么办呢?
首先,和之前一样,我们判断下一个值的差值是否大于 0,接着,我们对新增加的辅助列做移动:
(
df.assign(B=df.A.diff(1) > 0)
.assign(C=df.A.diff(-1) < 0)
)
'''
A B C
0 3 False True
1 4 True False
2 3 False False
3 2 False True
4 3 True True
5 5 True True
6 7 True False
7 6 False False
8 3 False False
'''
辅助列意义:
最后,根据 B 和 C 中至少有一个是 True 的来判断是否包含此数据:
(
df.assign(B=df.A.diff(1) > 0)
.assign(C=df.A.diff(-1) < 0)
.query('B | C') # B 和 C 至少有一个是增加的
)
'''
A B C
0 3 False True
1 4 True False
3 2 False True
4 3 True True
5 5 True True
6 7 True False
'''
这样就完美实现了增加起始值的需求。
针对上边的需求,我们现在需要将相对前一个数据有增加的筛选出来怎么做呢?可以使用变化率s.pct_change()
方法求得前后两个数据的变化率如果大于零则代表增加。
# 变化率的百分比大于零
df[df.A.pct_change() > 0]
'''
A
1 4
4 3
5 5
6 7
'''
通过上边的几个案例,我们可以轻松实现连续增加上升或者连续减少降低的需求。
(完)
更新时间:Aug. 18, 2024, 3:40 p.m. 标签:pandas 筛选 python