我有一个带有列的Pandas DataFrame:
UserID, Date, (other columns that we can ignore here)
我正在尝试仅选择在多个日期访问过的用户。我目前正在使用groupby(['UserID', 'Date'])
和for循环,我只删除一个结果,但我觉得有更好的方法来做到这一点。
由于
答案 0 :(得分:1)
这取决于您想要获得的输出的确切格式,但您可以计算每个UserID中的不同日期,并获取此计数的所有内容> 1(如SQL中的having count(distinct Date) > 1
):
>>> df
Date UserID
0 2013-01-01 00:00:00 1
1 2013-01-02 00:00:00 2
2 2013-01-02 00:00:00 2
3 2013-01-02 00:00:00 1
4 2013-01-02 00:00:00 3
>>> g = df.groupby('UserID').Date.nunique()
>>> g
UserID
1 2
2 1
3 1
>>> g > 1
UserID
1 True
2 False
3 False
dtype: bool
>>> g[g > 1]
UserID
1 2
您看到结果是UserID = 1
,这是在多个日期访问过的唯一用户
答案 1 :(得分:0)
计算每个UserID的唯一日期计数:
df.groupby("UserID").Date.agg(lambda s:len(s.unique()))
您只需支付一次即可删除用户。
答案 2 :(得分:0)
为了添加另一个答案,您还可以使用列表推导索引
DF = pd.DataFrame({'UserID' : [1, 1, 2, 3, 4, 4, 5], 'Data': np.random.rand(7)})
DF.ix[[row for row in DF.index if list(DF.UserID).count(DF.UserID[row])>1]]
这可能与你的for循环一样多,但它只是你考虑的另一种选择....