簡體   English   中英

將Pandas數據幀分組一列,根據另一列刪除行

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM