Saya memiliki kerangka data seperti yang ditunjukkan di bawah ini

Contract_ID    Unit_ID    Start_date     End_Date     Status
1              A          2014-05-01     2015-05-01   Closed
2              A          2016-05-01     2017-05-01   Expired
3              A          2018-05-01     2020-05-01   Active
4              B          2014-05-01     2015-05-01   Closed
5              B          2015-05-01     2016-05-01   Closed
6              C          2016-05-01     2017-05-01   Closed
7              C          2017-05-01     2018-05-01   Expired
8              D          2016-05-01     2017-05-01   Closed
9              D          2017-06-01     2018-05-01   Expired
10             D          2018-07-01     2020-08-01   Active

Dari atas saya ingin mengetahui Unit yang tidak memiliki status aktif.

Dari tabel di atas Unit A dan D berstatus aktif.

Keluaran yang diharapkan

Contract_ID    Unit_ID    Start_date     End_Date     Status
4              B          2014-05-01     2015-05-01   Closed
5              B          2015-05-01     2016-05-01   Closed
6              C          2016-05-01     2017-05-01   Closed
7              C          2017-05-01     2018-05-01   Expired
1
Danish 26 Januari 2020, 15:04

2 jawaban

Jawaban Terbaik

Ide pertama adalah menyaring semua grup jika tidak ada nilai Active per grup dengan GroupBy.transform dengan GroupBy.all:

df1 = df[df.assign(New=df['Status'].ne('Active')).groupby('Unit_ID')['New'].transform('all')]

Atau pertama-tama filter semua grup yang memiliki setidaknya satu Active dengan DataFrame.loc lalu filter menurut Series.isin dengan grup topeng terbalik tanpa grup Active:

df1 = df[~df['Unit_ID'].isin(df.loc[df['Status'].eq('Active'), 'Unit_ID'])]

print (df1)
   Contract_ID Unit_ID  Start_date    End_Date   Status
3            4       B  2014-05-01  2015-05-01   Closed
4            5       B  2015-05-01  2016-05-01   Closed
5            6       C  2016-05-01  2017-05-01   Closed
6            7       C  2017-05-01  2018-05-01  Expired
2
jezrael 26 Januari 2020, 12:06

Pendekatan lain dengan pd.crosstab dan Series.map

new_df = df[df['Unit_ID'].map(pd.crosstab(df['Unit_ID'],df['Status'])['Active'].eq(0))]

Atau dengan GroupBy.transform

new_df = df[df['Status'].ne('Active').groupby(df['Unit_ID']).transform('all')]

Keluaran

   Contract_ID Unit_ID  Start_date    End_Date   Status
3            4       B  2014-05-01  2015-05-01   Closed
4            5       B  2015-05-01  2016-05-01   Closed
5            6       C  2016-05-01  2017-05-01   Closed
6            7       C  2017-05-01  2018-05-01  Expired
2
ansev 26 Januari 2020, 12:25