Python 在数据集中保留模式的前n项(timeserie)
我想准备一个pd.DataFrame,其中包含与机器维护相关的数据。数据基于时间序列。在下面的示例中,我希望清理我的目标df['entry'],以便只保留每个模式开头的前2个元素。我有一个带有pd.shift的POC,但它可能会错过一些事件—下面示例中的最后一个事件。在pd.DataFrame中,我从4个模式开始。你知道如何创建一个功能来清理我的数据集并只保留模式的前n个元素吗 到目前为止,我所拥有的: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
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说了什么。。。我只是想提供一个答案。。。但是你没有给我们一个群体是什么的标准。群体不是一个正确的词,它更多的是时间序列中的模式。我会尽量澄清。几分钟后简单或回顾:-和有效。非常感谢。