Индексация групп Pandas: отбрасывать всю группу, если условие не выполнено

#python #pandas #pandas-groupby

#python #pandas #pandas-groupby

Вопрос:

У меня есть фрейм данных pandas следующим образом:

 df = pd.DataFrame({'alpha':['a','a','b','b'],'beta':[1,2,3,4]})
  

введите описание изображения здесь

Идея состоит в том, чтобы возвращать группы только в том случае, если в столбце выполняется определенное условие beta , в противном случае отбрасывать всю группу

Результат, который я хочу, это:

введите описание изображения здесь

Однако, что-то вроде, например.

 df.groupby('alpha').apply(lambda x: x.beta>1) 
  

не работает.

Ответ №1:

Попробуйте не использовать groupby , isin

 df.loc[~df.alpha.isin(df.loc[df.beta<=1,'alpha'])]
Out[316]: 
  alpha  beta
2     b     3
3     b     4
  

Если вам нужен groupby , вы можете использовать transform , поскольку это более эффективно, чем pass lambda

 df[df.beta.gt(1).groupby(df.alpha).transform('all')]
Out[317]: 
  alpha  beta
2     b     3
3     b     4
  

Время

 %timeit df.groupby('alpha').filter(lambda x: (x.beta >1).all())
100 loops, best of 3: 2.53 ms per loop
%timeit df.loc[~df.alpha.isin(df.loc[df.beta<=1,'alpha'])]
1000 loops, best of 3: 874 µs per loop
%timeit df[df.beta.gt(1).groupby(df.alpha).transform('all')]
100 loops, best of 3: 2.04 ms per loop
  

Ответ №2:

Вы можете использовать groupby.filter такие:

 print (df.groupby('alpha').filter(lambda x: (x.beta >1).all()))
  alpha  beta
2     b     3
3     b     4
  

Для lambda я понял, что вы хотите, чтобы all значение группы в beta было больше 1 в соответствии с вашим ожидаемым результатом.