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 select group by a count(1) > 1 在python pandas中等效?
sql语句select group by order by where一般先后顺序