Индексация панд гроуби: отбросить всю группу, если условие не выполнено - PullRequest
2 голосов
/ 14 марта 2019

У меня есть следующий пандас:

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

enter image description here

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

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

enter image description here

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

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

не работает.

Ответы [ 2 ]

2 голосов
/ 14 марта 2019

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

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

Если вы хотите групповой режим, вы можете использовать transform, поскольку это более эффективно, чем проход 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 голосов
/ 14 марта 2019

Вы можете использовать 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 согласно ожидаемому результату.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...