pandas数据筛选问题

问题遇到的现象和发生背景

下表是一个记录使用某产品使用情况的表,开始时间表示的是触碰使用开关所记录的时间;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_IDMode
2021/09/08 13:14:12000010
2021/09/08 13:15:32000011
2021/09/08 13:15:36000011
2021/11/03 08:45:12000020
2021/10/06 11:11:12000031
2021/11/03 08:54:02000021
2021/04/03 21:23:13000040
2021/03/23 11:31:41000050
2021/03/23 11:32:52000051
2021/11/03 08:55:11000021
2021/07/13 22:55:31000061
2021/07/13 22:56:02000061
2021/08/15 06:02:03000070
2021/01/06 17:19:01000080
2021/01/06 17:19:08000080
2021/06/02 13:11:37000091
2021/12/11 10:00:06000100

groupby之后
如下,就统计为,模式0和1均开1次:

开始时间Use_IDMode
2021/09/08 13:14:12000010
2021/09/08 13:15:32000011
2021/09/08 13:15:36000011

如下,就统计为,模式1开启一次

开始时间Use_IDMode
2021/07/13 22:55:31000061
2021/07/13 22:56:02000061
我的解答思路和尝试过的方法

想使用pandas筛选出相同的Use_ID然后判断MODE,如果0和1均有就算为均开,如果均为0或均为1就算为开启模式0或1。

我想要达到的结果

在Use_ID总计下:模式0:多少次;模式1:多少次,模式0和1均开:多少次

不太会用panda
用字典的话,先建立key:{00001:[],00002:[].........0000n:[]}
然后将Mode操作逐个放入对应的list
然后对list进行过滤,剩下的就是结果了

可以筛选出列之后用 anyall 方法实现

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

img

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()

img


看看结果是不是符合你需求