我遇到了熊猫问题。我有一个包含以下信息的数据框:
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
。
非常感谢您!
答案 0 :(得分:1)
将SeriesGroupBy.nunique
与Series.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)