将Pandas数据帧分组一列,根据另一列删除行

sep*_*deh 2 python group-by dataframe pandas pandas-groupby

我有一个pandas数据框,如下所示:

     UNIT        MACHINE
1    a100        001
2    a100        002
3    a100        003
4    a100        001
5    b222        001
6    b222        002
7    b222        002
8    b222        003
Run Code Online (Sandbox Code Playgroud)

我想基于"UNIT"对其进行分组,并删除没有[001,002,003]"MACHINE"序列的行.这意味着因为UNIT"a100"具有序列[001,002,003,001],所以它应该被丢弃,但UNIT"b222"仍然存在,因为无论MACHINE 002的重复如何,序列都是正确的.

输出应如下所示:

     UNIT        MACHINE
5    b222        001
6    b222        002
7    b222        002
8    b222        003
Run Code Online (Sandbox Code Playgroud)

序列[001,002,003]是我在这里作为例子编写的可接受的MACHINE序列之一.有几种这样的序列,所有这些序列都是单调递增的.

我应该如何组合GroupBy并执行此操作?

Max*_*axU 6

In [26]: chk_set = set(df.MACHINE.unique())

In [27]: df[df.groupby('UNIT')['MACHINE']
              .transform(lambda x: x.is_monotonic_increasing & chk_set.issubset(set(x)))]
Out[27]:
   UNIT MACHINE
5  b222     001
6  b222     002
7  b222     002
8  b222     003
Run Code Online (Sandbox Code Playgroud)

更新:

假设您有以下DF:

In [90]: df
Out[90]:
    UNIT MACHINE
1   a100     001
2   a100     002
3   a100     003
4   a100     001
5   b222     001
6   b222     002
7   b222     002
8   b222     003
9     c1     001
10    c1     003
11    c2     078
12    c2     079
13    c2     080
14    c3     078
16    c3     080
Run Code Online (Sandbox Code Playgroud)

以及要检查的连锁组数组:

In [91]: chk_groups = np.array(['001002003','078079080'])
Run Code Online (Sandbox Code Playgroud)

解:

In [92]: df[df.groupby('UNIT')['MACHINE']
              .transform(lambda x: x.is_monotonic_increasing
                                   & np.in1d(x.unique().sum(),chk_groups))]
Out[92]:
    UNIT MACHINE
5   b222     001
6   b222     002
7   b222     002
8   b222     003
11    c2     078
12    c2     079
13    c2     080
Run Code Online (Sandbox Code Playgroud)