python - 在数据集中保留前 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
欢迎评论。
解决方案
您可以使用 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
推荐阅读
- node.js - Nodemailer 无法从 .env 访问信息
- sql - 如何从两个选择语句中获得组合
- python - CAIRO_STATUS_WRITE_ERROR:b'error while writing to output stream' on Google Cloud Functions
- javascript - 使用 JQuery 删除 CSS 类
- react-redux - 为什么屏幕阅读器会读取一个 RadioButton 但会跳过其余的?
- ms-access - 用于多用户的带有链接表后端的 MS Access 前端
- multi-touch - 在 Safari 中处理 Emscripten 中的多点触控事件
- javascript - 重用冗余函数 angular 和 html
- sql - 尝试转换日期字段,会导致转换时出错
- angular - rxjs/Angular 中的订阅顺序