Поиск групп в фрейме данных pandas, удовлетворяющих нескольким логическим (логическим) условиям

#python #pandas #dataframe

#python #панды #фрейм данных

Вопрос:

У меня есть 3 столбца

 Level Status     Id
0     Complete   a1
1     Start      c1
1     Complete   c1
2     Start      d1
2     Start      d2
2     Fail       d2
 

Я хочу отфильтровать данные, в которых для каждого уровня должны быть только start и complete или start и fail, учитывая, что id для обоих одинаковы

 Level Status     Id
1     Start      c1
1     Complete   c1
2     Start      d2
2     Fail       d2
 

Ответ №1:

Вы можете использовать GroupBy.transform('any') для получения групп, соответствующих условию статуса, имеющих «Start», и статуса, также имеющего один из {«Fail», «Complete»}, используя

 status_has_start = df['Status'].eq('Start').groupby(df['Id']).transform('any')
status_has_complete_or_fail = (
    df['Status'].isin(['Complete', 'Fail']).groupby(df['Id']).transform('any'))

print (df.loc[status_has_start amp; status_has_complete_or_fail])

   Level    Status  Id
1      1     Start  c1
2      1  Complete  c1
4      2     Start  d2
5      2      Fail  d2 
 

Где,

 print (status_has_start)

0    False
1     True
2     True
3     True
4     True
5     True
Name: Status, dtype: bool

print (status_has_complete_or_fail)
 
0     True
1     True
2     True
3    False
4     True
5     True
Name: Status, dtype: bool
 

Если вам нужен 1 вкладыш на стероидах, вы можете запустить

 df.loc[pd.concat([df['Status'].eq('Start'), 
                  df['Status'].isin(['Complete', 'Fail'])], axis=1)
         .groupby([df['Level'], df['Id']])
         .transform('any')
         .all(axis=1)]

   Level    Status  Id
1      1     Start  c1
2      1  Complete  c1
4      2     Start  d2
5      2      Fail  d2
 

Комментарии:

1. Хороший ответ, но я думаю, нам нужно сгруппировать, используя Level and Id 🙂

2. @ShubhamSharma Спасибо, это тоже работает. Второй вариант включает дополнительный группировщик.

3. просто мысль .. подумайте, если для строки в индексе 2 значение level равно 3 , то первый вариант не будет учитывать same уровни, по которым он фильтрует группу, основываясь только на одном и том же Id , в этом случае для id будет два отдельных уровня c1