我试图在Matplotlib中突出显示Pandas数据框中的数据在连续多行中相同的区域,因此给定下面的数据框和阈值3:
在
days = pd.date_range(dt.datetime.now(), dt.datetime.now() + dt.timedelta(13), freq='D')
data = [2,3,3,3,2,2,3.4,3.1,2.7,np.nan,4,4,4,4.5]
df = pd.DataFrame({'cat': data})
df = df.set_index(days)
输出:
col
2021-03-12 15:13:24.727074 2.0
2021-03-13 15:13:24.727074 3.0
2021-03-14 15:13:24.727074 3.0
2021-03-15 15:13:24.727074 3.0
2021-03-16 15:13:24.727074 2.0
2021-03-17 15:13:24.727074 2.0
2021-03-18 15:13:24.727074 3.4
2021-03-19 15:13:24.727074 3.1
2021-03-20 15:13:24.727074 2.7
2021-03-21 15:13:24.727074 NaN
2021-03-22 15:13:24.727074 4.0
2021-03-23 15:13:24.727074 4.0
2021-03-24 15:13:24.727074 4.0
2021-03-25 15:13:24.727074 4.5
最终目标是返回以下 Dataframe ,其中'result'是一个测试,看'col'中的数据是否没有改变。2个连续的值2.0没有标记,因为它们只是2个连续的示例,而我们的阈值〉= 3。
col result
2021-03-12 15:13:24.727074 2.0 False
2021-03-13 15:13:24.727074 3.0 True
2021-03-14 15:13:24.727074 3.0 True
2021-03-15 15:13:24.727074 3.0 True
2021-03-16 15:13:24.727074 2.0 False
2021-03-17 15:13:24.727074 2.0 False
2021-03-18 15:13:24.727074 3.4 False
2021-03-19 15:13:24.727074 3.1 False
2021-03-20 15:13:24.727074 2.7 False
2021-03-21 15:13:24.727074 NaN False
2021-03-22 15:13:24.727074 4.0 True
2021-03-23 15:13:24.727074 4.0 True
2021-03-24 15:13:24.727074 4.0 True
2021-03-25 15:13:24.727074 4.5 False
我试着使用下面的cumsum(),当有差异时增加1。使用下面的代码:
df['increment'] = (df['col'].diff(1) != 0).astype('int').cumsum()
这可以使用以下方法获取连续块的大小
df.groupby('increment').size() >= threshold
这让我接近了,但问题是它破坏了我与原始dataframe datetime索引的链接,这意味着我无法将布尔数据与原始df ['col']一起绘制。
3条答案
按热度按时间0s0u357o1#
在与
shift
的比较中使用cumsum()
来标识块:输出:
==
来比较浮点数并不理想。相反,我们可以使用threshold,类似于:6ioyuze22#
使用shift测试连续相似性的布尔值选择。应用cumsum转换为组。使用结果组进行分组。应用transform查找大小。
bogh5gae3#
输出: