python-3.x - 模式识别和序列检测
问题描述
我有一个看起来像这样的数据集“df”:
MEMBER seen_1 seen_2 seen_3 seen_4 seen_5 seen_6
A 1 0 0 1 0 1
B 1 1 0 0 1 0
C 1 1 1 0 0 1
D 0 0 1 0 0 1
如您所见,有几行 1 和 0。任何人都可以建议我在 python 中编写一个代码,这样我就可以计算在第一次出现 1、0 和 0 之前连续出现的次数 1、0 和 0。例如,对于成员 A,第一个双零事件发生在 seen_2 和 seen_3,因此事件将为 1。同样对于成员 B,第一个双零事件发生在 see_3 和 seen_4,因此在此之前发生了两个 1 . 结果表应该有一个新列“事件”,如下所示:
MEMBER seen_1 seen_2 seen_3 seen_4 seen_5 seen_6 event
A 1 0 0 1 0 1 1
B 1 1 0 0 1 0 2
C 1 1 1 0 0 1 3
D 0 0 1 0 0 1 1
解决方案
我的做法:
df = df.set_index('MEMBER')
# count 1 on each rows since the last 0
s = (df.stack()
.groupby(['MEMBER', df.eq(0).cumsum(1).stack()])
.cumsum().unstack()
)
# mask of the zeros:
u = s.eq(0)
# look for the first 1 0 0
idx = (~u &
u.shift(-1, axis=1, fill_value=False) &
u.shift(-2, axis=1, fill_value=False) ).idxmax(1)
# look up
df['event'] = s.lookup(idx.index, idx)
测试数据:
MEMBER seen_1 seen_2 seen_3 seen_4 seen_5 seen_6
0 A 1 0 1 0 0 1
1 B 1 1 0 0 1 0
2 C 1 1 1 0 0 1
3 D 0 0 1 0 0 1
4 E 1 0 1 1 0 0
输出:
MEMBER seen_1 seen_2 seen_3 seen_4 seen_5 seen_6 event
0 A 1 0 1 0 0 1 1
1 B 1 1 0 0 1 0 2
2 C 1 1 1 0 0 1 3
3 D 0 0 1 0 0 1 1
4 E 1 0 1 1 0 0 2
推荐阅读
- java - 为什么 AlarmClock.EXTRA_SKIP_UI 不能与 AlarmClock.ACTION_DISMISS_ALARM 一起使用?
- android - 如何制作自定义TextView - 如何将单词的每个字母放在正方形内
- c# - 在我清除 C# 中的一个下拉列表后重新加载所有下拉列表
- vb.net - 为什么在使用组合框更改串行端口时出现 System.InvalidCastException?VB.NET 2019
- rancher - 如何在 Rancher 中使用 API 重新部署实例
- c - 尝试释放数组时出现访问冲突错误
- linux - 是否可以分发和使用 .so 文件而无需安装?
- microsoft-graph-api - Microsoft Graph 客户端 SDK - 按名称过滤组
- python - 处理参数时如何跳过 sys.argv[0]?
- netsuite - 订单完成后如何更新销售订单