2016-01-05 6 views
2

с данными с двумя столбцами: Пользователь и код, как я могу отфильтровать записи пользователя, в которых у них нет не менее x записей с данным кодом?Фильтрация фильтра данных Pandas

E.g. Я хотел бы, чтобы отфильтровать всех пользователей, когда они не имеют, по меньшей мере, 5 мест где данного типа:

User Type 
A  Alpha 
A  Alpha 
A  Alpha 
A  Alpha 
A  Alpha 
A  Beta 
A  Beta 
A  Beta 
B  Alpha 
B  Alpha 
B  Alpha 
B  Alpha 
B  Alpha 

Здесь я хотел бы, чтобы отфильтровать (убрать) 4x A с кодом Beta (только 4 раза здесь), сохраняя все остальное.

Спасибо!

ответ

1

Вы можете groupby на «User» и «тип» и filter:

In [91]: 
df.groupby(['User', 'Type']).filter(lambda x: len(x) > 4) 

Out[91]: 
    User Type 
0  A Alpha 
1  A Alpha 
2  A Alpha 
3  A Alpha 
4  A Alpha 
8  B Alpha 
9  B Alpha 
10 B Alpha 
11 B Alpha 
12 B Alpha 
+0

это идеально подходит в самом деле! Спасибо! Я попытался изменить функцию labnda, чтобы сделать еще один шаг - отфильтровывает все записи, где сумма другого поля меньше 10. arr.groupby (['Пользователь', 'TYPE', 'APPDOMAIN']). фильтр (lambda x: sum (arr.Closed)> 10) Не совсем это делало. Какой-нибудь последний совет? Еще раз спасибо! –

+0

lambda передается группе как 'x', поэтому она должна быть' (...). Filter (lambda x: sum (x.Closed))> 10' вместо '... arr.Closed ... ' – miraculixx

1

как я могу отфильтровать записи пользователей, где они не имеют, по крайней мере х записей с данным Кодексом?

Если вы хотите знать, какие из них были сохранены или удалены:

# counts 
grouped = df.groupby(['User', 'Type']).apply(lambda g : len(g) > 4) 
grouped = grouped.reset_index(name='keep') 
# merge back and filter 
data = df.merge(grouped).query('keep == True') 
removed = df.merge(grouped).query('keep == False') 
Смежные вопросы