在pandas数据帧中查找频繁的用户

时间:2014-02-23 06:27:04

标签: python group-by pandas dataframe

我有一个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()})

2 个答案:

答案 0 :(得分:3)

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

# 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

答案 1 :(得分:1)

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

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

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