df['check'] = ((df['id'] == 123) & (df['date1'] >= date1)) | ((df['id'] == 456) & (df['date2'] >= date2))
present = df.groupby(['id', 'month', 'check'])['userid'].nunique().reset_index(name="usercount")
这是我的代码,因此我的预期输出必须每月在usercount
列中具有唯一身份用户数
由id
分组。我在id
中使用了month
,check
和groupby
。
根据我的代码的第一行,check
列的类型为bool
,但是当我从present
数据帧中获得输出时,将统计拥有check
的用户值是True
,谁也有False
。
实际上,它应该计算True
列中只有check
的用户。
在这方面帮助我
答案 0 :(得分:1)
您需要按boolean indexing
按check
列进行过滤,而不是传递给by
中的groupby
参数:
#first convert datetimes to start of months
df['month'] = df['month'].dt.floor('d') - pd.offsets.MonthBegin(1)
print (df)
check month id userid
0 True 2019-06-01 123 a
1 False 2019-02-01 123 b
2 False 2019-01-01 123 c
3 False 2019-02-01 123 d
4 True 2019-06-01 123 e
5 True 2020-07-01 123 f
6 True 2020-07-01 123 g
7 True 2020-06-01 123 h
print (df[df['check']])
check month id userid
0 True 2019-06-01 123 a
4 True 2019-06-01 123 e
5 True 2020-07-01 123 f
6 True 2020-07-01 123 g
7 True 2020-06-01 123 h
present = (df[df['check']].groupby(['id', 'month'])['userid']
.nunique()
.reset_index(name="usercount"))
print (present)
id month usercount
0 123 2019-06-01 2
1 123 2020-06-01 1
2 123 2020-07-01 2