下表是一个记录使用某产品使用情况的表,开始时间表示的是触碰使用开关所记录的时间;Use_ID表示的是产品使用记录码,每一条都表示一次全新的使用记录;Mode为产品的两种使用模式,存在三种情况:只开模式0,只开模式1,模式0和模式1均开。以下表为例子:Use_ID为00001有三条使用记录意味着在00001这次使用过程中,先打开了模式0,而后打开了模式1,然后又点了一次模式1(可以理解为顾客误触操作),再比如00002有三条使用记录意味着用户在11月3日那天八点多,先打开了模式0,后又开了两次模式1。请注意:正常用户使用情况应该如00003或00004或00005等,只在那个时间点打开一个模式或两个均开(不存在误操作)。现在想做一个统计,即每一次使用的过程中,模式0,模式1和模式0和1均开,分别有多少次。类似于一条使用记录中出现两次模式0,或者两次模式1均视为误操作,不纳入统计范畴。
开始时间 | Use_ID | Mode |
---|---|---|
2021/09/08 13:14:12 | 00001 | 0 |
2021/09/08 13:15:32 | 00001 | 1 |
2021/09/08 13:15:36 | 00001 | 1 |
2021/11/03 08:45:12 | 00002 | 0 |
2021/10/06 11:11:12 | 00003 | 1 |
2021/11/03 08:54:02 | 00002 | 1 |
2021/04/03 21:23:13 | 00004 | 0 |
2021/03/23 11:31:41 | 00005 | 0 |
2021/03/23 11:32:52 | 00005 | 1 |
2021/11/03 08:55:11 | 00002 | 1 |
2021/07/13 22:55:31 | 00006 | 1 |
2021/07/13 22:56:02 | 00006 | 1 |
2021/08/15 06:02:03 | 00007 | 0 |
2021/01/06 17:19:01 | 00008 | 0 |
2021/01/06 17:19:08 | 00008 | 0 |
2021/06/02 13:11:37 | 00009 | 1 |
2021/12/11 10:00:06 | 00010 | 0 |
groupby之后
如下,就统计为,模式0和1均开1次:
开始时间 | Use_ID | Mode |
---|---|---|
2021/09/08 13:14:12 | 00001 | 0 |
2021/09/08 13:15:32 | 00001 | 1 |
2021/09/08 13:15:36 | 00001 | 1 |
如下,就统计为,模式1开启一次
开始时间 | Use_ID | Mode |
---|---|---|
2021/07/13 22:55:31 | 00006 | 1 |
2021/07/13 22:56:02 | 00006 | 1 |
想使用pandas筛选出相同的Use_ID然后判断MODE,如果0和1均有就算为均开,如果均为0或均为1就算为开启模式0或1。
在Use_ID总计下:模式0:多少次;模式1:多少次,模式0和1均开:多少次
不太会用panda
用字典的话,先建立key:{00001:[],00002:[].........0000n:[]}
然后将Mode操作逐个放入对应的list
然后对list进行过滤,剩下的就是结果了
可以筛选出列之后用 any
和 all
方法实现
In [16]: def query(df: pandas.DataFrame, useID: int) -> str:
...: col = df[df['Use_ID'] == userID]
...: # 全是 1
...: if col.all():
...: return 'mode 1'
...: # 有 0 也有 1
...: if col.any():
...: return 'mode 0 and 1'
...: # 全是 0
...: return 'mode 0'
...:
groupby之后把分组长度和mode的合计和进行比较。
1.mode合计是0:只使用了模式0
2.mode合计大于分组长度:模式0和模式1都使用
3.mode合计🟰分组长度:仅用了模式1
def process(s):
v = s.values
if 0 in v and 1 in v:
return '01'
elif 0 in v and 1 not in v:
return '0'
else:
return '1'
result = df.groupby(['Use_ID'])['Mode'].apply(process).value_counts()