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