python - 计算 pandas 中的连续重复值

标签 python pandas matplotlib

我试图突出显示 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

最终目标是返回以下数据帧,其中“结果”是一个测试,以查看“col”中的数据是否没有变化。 2.0 的 2 个连续值不会标记,因为它们只是 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()

这可以使用以下方法获取连续 block 的大小

df.groupby('increment').size() >= threshold

这让我很接近,但问题是它破坏了我与原始数据帧日期时间索引的链接,这意味着我无法将 bool 数据与原始 df['col'] 一起绘制。

最佳答案

使用cumsum()shift进行比较来识别 block :

# groupby exact match of values
blocks = df['col'].ne(df['col'].shift()).cumsum()

df['result'] = blocks.groupby(blocks).transform('size') >= 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

注意使用==来比较 float 并不理想。相反,我们可以使用阈值,例如:

# groupby consecutive rows if the differences are not significant
blocks = df['col'].diff().abs().gt(1e-6).cumsum()

关于python - 计算 pandas 中的连续重复值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66607450/

相关文章:

python - Pandas :转换列的类型

python - 转置 pandas 数据框并垂直 append

python - 如何在多个子图中绘图

python - 如何优化预处理所有文本文档而不使用 for 循环在每次迭代中预处理单个文本文档?

matplotlib - 如何在 matplotlib 中控制鼠标悬停文本

python - 在 Python 中使用 matplotlib 绘制多个图

python - Matplotlib 直方图在第二个直方图箱中添加了一个小条

python - 向 OpenCV 生成的视频添加音频

python - Keras.layers.concatenate 生成错误'

python - 如何在 seaborn 的 facetgrid 中设置可读的 xticks?