#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
andId
🙂2. @ShubhamSharma Спасибо, это тоже работает. Второй вариант включает дополнительный группировщик.
3. просто мысль .. подумайте, если для строки в индексе
2
значение level равно3
, то первый вариант не будет учитыватьsame
уровни, по которым он фильтрует группу, основываясь только на одном и том жеId
, в этом случае для id будет два отдельных уровняc1