按对象统计分组中子组中的行数

时间:2019-04-11 09:11:01

标签: python pandas

我遇到了熊猫问题。我有一个包含以下信息的数据框:

Timestamp     User_id     page_id

01-01-2005     1             2
01-01-2005     1             3
01-01-2005     1             4
01-02-2006     2             3
01-03-2005     3             2
01-03-2005     3             1
01-04-2006     2             3
01-04-2006     2             1
01-04-2006     1             5
01-04-2006     1             3
01-01-2005     4             2
01-05-2006     2             3
01-08-2005     5             2
01-07-2006     6             3
01-01-2005     1             3
01-02-2006     2             3
01-04-2005     7             2
01-09-2006     2             3
01-10-2005     1             2
01-12-2006     3             3
01-01-2005     4             2
01-02-2006     5             3
01-01-2005     6             2
01-02-2006     2             1

所以我想找出每个月每个user_id编辑了多少个唯一的page_id。这意味着我必须按时间戳和user_id进行分组,然后应用以下lambda表达式来消除重复的page_id:

df = data.groupby([pd.Grouper(key ='timestamp', freq='MS'),'user_id']).apply(lambda x: x.drop_duplicates('page_id'))

在执行此步骤之后,我将继续学习如何获取如下所示的数据框:

Timestamp   User_id     page_id_count

01-01-2005     1          X

具有X = number在2005年1月1日编辑过的page_id个不同的User_id = 1 任何帮助都会很棒。预先非常感谢。

更新:

Jezrael给出的以下答案已解决了这个问题。

现在,我需要为每个page_id获取一个月内编辑了多少个不同的user_id。 输出将如下所示:

Timestamp      page_id      user_id_count

01-01-2005        2              Y

在日期Y上编辑user_id的不同page_id = 2的数量为01-01-2005

非常感谢您!

1 个答案:

答案 0 :(得分:1)

SeriesGroupBy.nuniqueSeries.reset_index一起使用:

#if necessary
#df['Timestamp'] = pd.to_datetime(df['Timestamp'])

df = (df.groupby([pd.Grouper(key ='Timestamp', freq='MS'),'User_id'])['page_id']
       .nunique()
       .reset_index(name='page_id_count'))
print (df)
    Timestamp  User_id  page_id_count
0  2005-01-01        1              3
1  2005-01-01        3              2
2  2005-01-01        4              1
3  2005-01-01        5              1
4  2005-01-01        6              1
5  2005-01-01        7              1
6  2006-01-01        1              2
7  2006-01-01        2              2
8  2006-01-01        3              1
9  2006-01-01        5              1
10 2006-01-01        6              1

编辑:

仅交换列的值:

df = (df.groupby([pd.Grouper(key ='Timestamp', freq='MS'),'page_id'])['User_id']
       .nunique()
       .reset_index(name='User_id_count'))
print (df)