我有一个带有列的 Pandas DataFrame:
UserID, Date, (other columns that we can ignore here)
我试图只选择在多个日期访问过的用户。我目前正在使用groupby(['UserID', 'Date'])
for 循环来执行此操作,在该循环中我只使用一个结果来删除用户,但我觉得有一种更好的方法可以做到这一点。
谢谢
这取决于您想要获得的输出的确切格式,但您可以计算每个 UserID 内的不同日期并获取所有此计数 > 1 的位置(如having count(distinct Date) > 1
SQL 中):
>>> 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
了结果,它是唯一一个在多个日期访问过的用户
要计算每个 UserID 的唯一日期计数:
df.groupby("UserID").Date.agg(lambda s:len(s.unique()))
您可以只删除一个计数的用户。
为了添加另一个答案,您还可以使用带有列表理解的索引
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 循环一样多,但它只是您考虑的另一种选择....