【问题标题】:Finding frequent users in pandas dataframe在 pandas 数据框中查找频繁用户
【发布时间】:2014-03-24 18:30:57
【问题描述】:

我有一个 pandas 数据框,其中包含名为 user_id 和 login_date 的列,我想获取频繁用户的 ID(即多次登录)和他们的登录频率。

为此,我尝试了:

    frequent_users = df.groupby(['login_date', 'user_id']).agg({"user_id": lambda x: x.count()})

结果是:

2011-01-17

          556     1
          456     1
          958     1
          374     2

2011-01-18

          789     1
          434     4
          654     1

问题是,如何删除或过滤掉频率为 1 的所有条目?

编辑:

这是一个例子:

    login_dates = ['2011-01-17', '2011-01-17', '2011-01-17', '2011-01-17', '2011-01-17', '2011-01-18', '2011-01-18','2011-01-18','2011-01-18', '2011-01-18', '2011-01-18']
    user_id =[556,456,958,347,347,789,434,434,434,434,654]
    df = DataFrame({'login_date': login_dates, 'user_id': user_id})
    frequent_users = df.groupby(['login_date', 'user_id']).agg({"user_id": lambda x: x.count()})

【问题讨论】:

    标签: python group-by pandas dataframe


    【解决方案1】:

    我认为在这里使用 apply 可能更简单:

    # instead of lambda x: x.count()
    def count_more_than_one(x):
        c = x.value_counts()
        return c[c > 1]
    
    In [11]: df.groupby(['login_date'])['user_id'].apply(count_more_than_one)
    Out[11]:
    login_date
    2011-01-17  347    2
    2011-01-18  434    4
    dtype: int64
    
    In [12]: df.groupby(['login_date'])['user_id'].apply(count_more_than_one).unstack(1)
    Out[12]:
                347  434
    login_date
    2011-01-17    2  NaN
    2011-01-18  NaN    4
    

    【讨论】:

    • 这不太行,因为 c 是一个整数,而不是一个列表。如果我定义一个结果列表并且只返回计数 > 1 的结果,我有与上面相同的列表,但用 [] 替换 1s...
    • @Qbite 啊,我的意思是 value_counts (你能检查一下编辑后的版本是否有效吗?)ps。有助于提供一个小例子,以便我们检查它:)
    • 不,它不起作用。我得到一个错误:ValueError:函数没有减少。你是对的,如果我提供一个例子会更容易。检查原始帖子的编辑版本。
    • @Qbite 这似乎适用于 apply :s (感谢编辑,让它更容易,如果我还没有 +1d,我会再来一次!):)
    • 知道了,上面的选项可以完成这项工作。谢谢!
    【解决方案2】:

    突然提到我最喜欢的方法...

    frequent_users = df.groupby('user_id').filter(lambda x: x.count() > 1)
    

    回答您问题的第二部分“他们登录的频率”不是很清楚。您想要登录之间的平均时间吗?登录总数?

    【讨论】:

    • 我想要每天的登录总数(login_date),但我想过滤掉任何唯一用户,即我只想保留多次登录的用户。
    • 看来 OP 想用 value_counts 链接一个过滤器? (就像你说的,不清楚!)
    猜你喜欢
    • 1970-01-01
    • 2021-04-21
    • 1970-01-01
    • 1970-01-01
    • 2021-12-20
    • 2021-09-23
    • 2017-01-31
    • 2016-01-26
    • 1970-01-01
    相关资源
    最近更新 更多