Требуется 2 различные операции - фильтрация по группам и агрегация по группам .
Фильтрация :
Длялучшую производительность лучше использовать transform
для логической маски и фильтрации по boolean indexing
.
df1 = df[~df['Number'].eq(0).groupby(df['User']).transform('all')]
print (df1)
User Number
0 A 0
1 A 4
2 A 5
5 C 1
6 C 3
Шаги:
1. Сначала создайте логическую серию, сравнив Number
с eq
:
print (df['Number'].eq(0))
0 True
1 False
2 False
3 True
4 True
5 False
6 False
Name: Number, dtype: bool
2.Затем используйте синтаксический сахар - groupby
в другом столбце и transform
функция all
для проверки, все ли True
с на группу и transform
для маски того же размера, что и оригинал DataFrame
:
print (df['Number'].eq(0).groupby(df['User']).transform('all'))
0 False
1 False
2 False
3 True
4 True
5 False
6 False
Name: Number, dtype: bool
3.Инвертируйте маску Boolen с помощью ~
:
print (~df['Number'].eq(0).groupby(df['User']).transform('all'))
0 True
1 True
2 True
3 False
4 False
5 True
6 True
Name: Number, dtype: bool
4.Фильтр:
print (df[~df['Number'].eq(0).groupby(df['User']).transform('all')])
User Number
0 A 0
1 A 4
2 A 5
5 C 1
6 C 3
Еще одно более медленное решение в большом DataFrame с фильтром и той же логикой, что и в первом решении:
df2 = df.groupby('User').filter(lambda x: ~x['Number'].eq(0).all())
print (df2)
User Number
0 A 0
1 A 4
2 A 5
5 C 1
6 C 3
Агрегирование :
Для упрощенияагрегирование по одному столбцу с одной функцией агрегирования, например GroupBy.var
использование:
df3 = df.groupby('User', as_index=False)['Number'].var()
print (df3)
User Number
0 A 7
1 B 0
2 C 2