首页 > 解决方案 > 在数据集中保留前 n 个模式项(timeserie)

问题描述

我想准备一份pd.DataFrame与机器维护相关的数据。数据基于时间序列。我想清理我的目标(df['entry']在下面的示例中)以仅保留每个模式开始的前 2 个元素。我有一个 POC,pd.shift但它可能会错过一些事件(下例中的最后一个事件)。在 中pd.DataFrame,我有 4 种模式开始。知道如何创建一个功能来清理我的数据集并只保留模式的前 n 个元素吗?

到目前为止我所拥有的:

df = pd.DataFrame({'entry':   [0,1,1,1,1,1,0,0,1,1,0,0,0,1,0,1,0],
                   'Expected':[0,1,1,0,0,0,0,0,1,1,0,0,0,1,0,1,0],
                   'comment': ['', 'keep', 'keep', 'drop', 'drop', 'drop', '', '', 'keep', 'keep', '', '', '', 'keep', '', 'How to get that one ?', '']})

df['shifted'] = df['entry'].shift(2).fillna(0)
def first(entry):
  return entry['entry']==1 and entry['shifted']==0
df['calculated'] = df.apply(first, axis=1)
df

下面是我从我的脚本中得到的,查看最后一行之前的计算错误(模式的开始丢失)

entry   Expected    comment     shifted     calculated
0       0.0                     0.0         False
1       1           keep        0.0         True
1       1           keep        0.0         True
1       0           drop        1.0         False
1       0           drop        1.0         False
1       0           drop        1.0         False
0       0                       1.0         False
0       0                       1.0         False
1       1           keep        0.0         True
1       1           keep        0.0         True
0       0                       1.0         False
0       0                       1.0         False
0       0                       0.0         False
1       1           keep        0.0         True
0       0                       0.0         False
1       1           How to get that one ?   1.0     False
0       0                       0.0     False

欢迎评论。

标签: pythonpandas

解决方案


您可以使用 groupby、cumsum 和 head:

df['Expected_1'] = df.groupby(df['entry'].diff().eq(1).cumsum())\
                     .head(2)['entry'].reindex(df.index, fill_value=0)

输出:

    Expected                comment  entry  Expected_1
0          0                             0           0
1          1                   keep      1           1
2          1                   keep      1           1
3          0                   drop      1           0
4          0                   drop      1           0
5          0                   drop      1           0
6          0                             0           0
7          0                             0           0
8          1                   keep      1           1
9          1                   keep      1           1
10         0                             0           0
11         0                             0           0
12         0                             0           0
13         1                   keep      1           1
14         0                             0           0
15         1  How to get that one ?      1           1
16         0                             0           0
​

推荐阅读