поднабор данных в зависимости от условия pandas - PullRequest
1 голос
/ 26 января 2020

У меня есть кадр данных, как показано ниже

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

Из приведенного выше я хотел бы узнать единицы измерения, у которых статус не активен.

Из приведенной выше таблицы Единицы A и D имеет активный статус.

Ожидаемый результат

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

Ответы [ 2 ]

2 голосов
/ 26 января 2020

Другой подход с pd.crosstab и Series.map

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

или с GroupBy.transform

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

Выход

   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 голосов
/ 26 января 2020

Первая идея - отфильтровать все группы, если нет значений Active для групп по GroupBy.transform с GroupBy.all:

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

или первым фильтром все группы, где есть хотя бы одна Active по DataFrame.loc, а затем фильтрация по Series.isin с инвертированными группами масок без групп 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
...