统计Pandas中的连续重复值

9nvpjoqh  于 2023-03-06  发布在  其他
关注(0)|答案(3)|浏览(205)

我试图在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']一起绘制。

0s0u357o

0s0u357o1#

在与shift的比较中使用cumsum()来标识块:

# 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
    • 注意**使用==来比较浮点数并不理想。相反,我们可以使用threshold,类似于:
# groupby consecutive rows if the differences are not significant
blocks = df['col'].diff().abs().gt(1e-6).cumsum()
6ioyuze2

6ioyuze22#

使用shift测试连续相似性的布尔值选择。应用cumsum转换为组。使用结果组进行分组。应用transform查找大小。

df=df.assign(result=df.groupby((~df.cat.eq(df.cat.shift())).cumsum())['cat'].transform('size').ge(3))

             

                            cat  result
2021-03-13 05:32:30.309303  2.0   False
2021-03-14 05:32:30.309303  3.0    True
2021-03-15 05:32:30.309303  3.0    True
2021-03-16 05:32:30.309303  3.0    True
2021-03-17 05:32:30.309303  2.0   False
2021-03-18 05:32:30.309303  2.0   False
2021-03-19 05:32:30.309303  3.4   False
2021-03-20 05:32:30.309303  3.1   False
2021-03-21 05:32:30.309303  2.7   False
2021-03-22 05:32:30.309303  NaN   False
2021-03-23 05:32:30.309303  4.0    True
2021-03-24 05:32:30.309303  4.0    True
2021-03-25 05:32:30.309303  4.0    True
2021-03-26 05:32:30.309303  4.5   False
bogh5gae

bogh5gae3#

def function1(ss:pd.Series):
    if ss.iloc[1:].all():
        df1.loc[ss.index,'result']=True
    return 0

df1.col.diff().eq(0).rolling(3).apply(function1).pipe(lambda dd:df1.assign(result=df1.result.fillna(False)))

输出:

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

相关问题