Вы можете отфильтровать по boolean indexing
до или в цикле:
df = pd.DataFrame({'ID':[1,1,1,2,2,2,3,3],
'value':[42, 89, 250, 31, 130, 108, 10, 93]})
print (df)
ID value
0 1 42
1 1 89
2 1 250
3 2 31
4 2 130
5 2 108
6 3 10
7 3 93
Если для какой-либо группы значение не совпадает, оно пропускается, как группа 3
:
grouped = df[df['value'] > 100].groupby('ID')
for name, group in grouped:
print(name, group)
1 ID value
2 1 250
2 ID value
4 2 130
5 2 108
Или, если фильтр в цикле возвращается пустым DataFrame для несоответствующей группы:
grouped = df.groupby('ID')
for name, group in grouped:
print(name, group[group['value'] > 100])
1 ID value
2 1 250
2 ID value
4 2 130
5 2 108
3 Empty DataFrame
Columns: [ID, value]
Index: []
РЕДАКТИРОВАТЬ:
Если требуется фильтрация по значениям, различным для каждой группы, возможно решение с map
по словарю со столбцом ID
, затем сравните с value
и отфильтруйте по boolean indexing
:
d = {1:100, 2: 121, 3: 10}
df = df[df['value'] > df['ID'].map(d)]
print (df)
ID value
2 1 250
4 2 130
7 3 93
Сведения :
print (df['ID'].map(d))
0 100
1 100
2 100
3 121
4 121
5 121
6 10
7 10
Name: ID, dtype: int64