[英]Group Pandas dataframe by one column, drop rows based on another column
我有一個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
我想基於“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
序列[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
更新:
假設您有以下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
以及要檢查的連鎖組數組:
In [91]: chk_groups = np.array(['001002003','078079080'])
解:
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
使用diff
+ groupby
+ transform
all
。
m = df.MACHINE\
.astype(int)\
.diff()\
.fillna(0)\
.isin([0, 1])\
.groupby(df.UNIT)\
.transform('all')
m
1 False
2 False
3 False
4 False
5 True
6 True
7 True
8 True
Name: MACHINE, dtype: bool
使用diff
+ isin
來檢測行是否不減少(只有0或1的步驟被認為是有效的)。
接下來,使用m
,index到df
。
df[m]
UNIT MACHINE
5 b222 001
6 b222 002
7 b222 002
8 b222 003
你可以做 :
df.groupby('UNIT')['MACHINE'].transform(lambda x : (x.astype(int).diff().fillna(0) >= 0).all())
df[sample]
UNIT MACHINE
5 b222 1
6 b222 2
7 b222 2
8 b222 3
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.