Python 在数据集中保留模式的前n项(timeserie)

Python 在数据集中保留模式的前n项(timeserie),python,pandas,Python,Pandas,我想准备一个pd.DataFrame,其中包含与机器维护相关的数据。数据基于时间序列。在下面的示例中,我希望清理我的目标df['entry'],以便只保留每个模式开头的前2个元素。我有一个带有pd.shift的POC,但它可能会错过一些事件—下面示例中的最后一个事件。在pd.DataFrame中,我从4个模式开始。你知道如何创建一个功能来清理我的数据集并只保留模式的前n个元素吗 到目前为止,我所拥有的: df = pd.DataFrame({'entry': [0,1,1,1,1,1,0,0

我想准备一个pd.DataFrame,其中包含与机器维护相关的数据。数据基于时间序列。在下面的示例中,我希望清理我的目标df['entry'],以便只保留每个模式开头的前2个元素。我有一个带有pd.shift的POC,但它可能会错过一些事件—下面示例中的最后一个事件。在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

欢迎评论。

因为您希望保留“条目”和“预期”相同的行,这对您有用吗

df1=df[df['entry']== df['Expected']]
结果是

entry   Expected    comment
0   0   
1   1   keep
1   1   keep
0   0   
0   0   
1   1   keep
1   1   keep
0   0   
0   0   
0   0   
1   1   keep
0   0   
1   1   How to get that one ?
0   0   
entry   Expected    comment
1   1   keep
1   1   keep
1   1   keep
1   1   keep
1   1   keep
1   1   How to get that one ?
如果要删除条目也为0的行,可以使用下面的代码

mask=df['entry'].ne(0)
df2=df[mask].loc[df['entry']==df['Expected']]
结果是

entry   Expected    comment
0   0   
1   1   keep
1   1   keep
0   0   
0   0   
1   1   keep
1   1   keep
0   0   
0   0   
0   0   
1   1   keep
0   0   
1   1   How to get that one ?
0   0   
entry   Expected    comment
1   1   keep
1   1   keep
1   1   keep
1   1   keep
1   1   keep
1   1   How to get that one ?

您可以使用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
​

请粘贴预期的输出。这使得建议解决方案更容易如果您希望执行groupby,然后从每个组中获取前n项,那么您可以df.groupby…headn。在您的代码中,您只保留了groups的前2个元素,但是似乎没有使用groupby。如果您能澄清i您仅保留组的前2个元素是什么意思,ii是您当前的代码,为您提供了预期的输出,那么这将有助于更好地理解问题。谢谢,@edesz说了什么。。。我只是想提供一个答案。。。但是你没有给我们一个群体是什么的标准。群体不是一个正确的词,它更多的是时间序列中的模式。我会尽量澄清。几分钟后简单或回顾:-和有效。非常感谢。