【问题标题】:sql select group by a having count(1) > 1 equivalent in python pandas?sql select group by a count(1) > 1 在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 提供客户的全部记录,但我想要汇总表。

【问题讨论】:

    标签: python sql pandas dataframe


    【解决方案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'))
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-12-24
        • 2019-12-22
        • 2018-03-16
        • 1970-01-01
        • 2012-06-30
        • 2020-08-15
        • 1970-01-01
        相关资源
        最近更新 更多