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并执行此操作?
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)