gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 07:57:57 25 4
gpt4 key购买 nike

我试图在 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
最终目标是返回以下数据帧,其中 'result' 是一个测试,以查看 '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()
这可以使用以下方法获取连续块的大小
df.groupby('increment').size() >= threshold
这让我很接近,但问题是它破坏了我与原始数据帧日期时间索引的链接,这意味着我无法将 bool 数据与原始 df['col'] 一起绘制。

最佳答案

使用 cumsum()关于与 shift 的比较识别块:

# 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com