1

我有一个带有列的 Pandas DataFrame:

UserID, Date, (other columns that we can ignore here)

我试图只选择在多个日期访问过的用户。我目前正在使用groupby(['UserID', 'Date'])for 循环来执行此操作,在该循环中我只使用一个结果来删除用户,但我觉得有一种更好的方法可以做到这一点。

谢谢

4

3 回答 3

1

这取决于您想要获得的输出的确切格式,但您可以计算每个 UserID 内的不同日期并获取所有此计数 > 1 的位置(如having count(distinct Date) > 1SQL 中):

>>> 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了结果,它是唯一一个在多个日期访问过的用户

于 2013-10-31T03:15:59.543 回答
0

要计算每个 UserID 的唯一日期计数:

df.groupby("UserID").Date.agg(lambda s:len(s.unique()))

您可以只删除一个计数的用户。

于 2013-10-31T03:17:34.067 回答
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 循环一样多,但它只是您考虑的另一种选择....

于 2013-10-31T11:18:16.007 回答