sql select group by a count(1) > 1 在python pandas中等效?

Posted

技术标签:

【中文标题】sql select group by a count(1) > 1 在python pandas中等效?【英文标题】:sql select group by a having count(1) > 1 equivalent in python pandas? 【发布时间】:2015-02-27 09:32:03 【问题描述】:

我很难过滤 pandas 中的 groupby 项目。我想做

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 提供客户的全部记录,但我想要汇总表。

【问题讨论】:

【参考方案1】:

不用写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

【讨论】:

【参考方案2】:

另外两种解决方案(采用现代“方法链”方法):

使用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'))

【讨论】:

以上是关于sql select group by a count(1) > 1 在python pandas中等效?的主要内容,如果未能解决你的问题,请参考以下文章

sql语句中的group by啥意思

sql中 group by排序

sql select group by a count(1) > 1 在python pandas中等效?

sql语句select group by order by where一般先后顺序

sql语句select group by order by where一般先后顺序

sql语句select group by order by where一般先后顺序