2014-12-31 2 views
3

Мне сложно фильтровать groupby элементов в пандах. Я хочу сделатьsql выбрать группу по счету (1)> 1 эквивалент в python pandas?

select email, count(1) as cnt 
from customers 
group by email 
having count(email) > 1 
order by cnt desc 

Я сделал

customers.groupby('Email')['CustomerID'].size() 

, и это дает мне список сообщений электронной почты и их соответствующих подсчетов правильно, но я не в состоянии достичь having count(email) > 1 части.

email_cnt[email_cnt.size > 1] 

возвращает 1

email_cnt = customers.groupby('Email') 
email_dup = email_cnt.filter(lambda x:len(x) > 2) 

дает всю запись клиентов с email > 1, но я хочу агрегированный таблицу.

ответ

2

Вместо того, чтобы писать email_cnt[email_cnt.size > 1], просто напишите email_cnt[email_cnt > 1] (нет необходимости звонить по телефону .size). Это использует логическую серию email_cnt > 1 для возврата только соответствующих значений email_cnt.

Например:

>>> customers = pd.DataFrame({'Email':['foo','bar','foo','foo','baz','bar'], 
           'CustomerID':[1,2,1,2,1,1]}) 
>>> email_cnt = customers.groupby('Email')['CustomerID'].size() 
>>> email_cnt[email_cnt > 1] 
Email 
bar  2 
foo  3 
dtype: int64 
1

Два других решений (с современной "метод цепочки" подход):

Использование selection by callable:

customers.groupby('Email').size().loc[lambda x: x>1].sort_values() 

Использование query method:

(customers.groupby('Email')['CustomerID']. 
    agg([len]).query('len > 1').sort_values('len')) 
Смежные вопросы