2015-03-31 56 views
1

我用类似下面的数据帧的工作:大熊猫 - 如何筛选“最频繁的” datetime对象

User_ID Datetime 
01 2014-01-01 08:00:00 
01 2014-01-02 09:00:00 
02 2014-01-02 10:00:00 
02 2014-01-03 11:00:00 
03 2014-01-04 12:00:00 
04 2014-01-04 13:00:00 
05 2014-01-02 14:00:00 

我想基础上,datetime列来筛选在一定条件下的用户,例如只在夏季过滤仅出现一次/月的用户,或仅出现用户等

到目前为止,我组与DF:

g = df.groupby(['User_ID','Datetime']).size() 

在每个用户的时间获得的“痕迹” :

User_ID Datetime 
01 2014-01-01 08:00:00 
     2014-01-02 09:00:00 
02 2014-01-02 10:00:00 
     2014-01-03 11:00:00 
03 2014-01-04 12:00:00 
04 2014-01-04 13:00:00 
05 2014-01-02 14:00:00 

然后我涂敷的掩模来过滤,例如,与一个以上的迹线的用户:

mask = df.groupby('User_ID')['Datetime'].apply(lambda g: len(g)>1) 
df = df[df['User_ID'].isin(mask[mask].index)] 

所以这很好。我正在寻找一个功能,而不是lambda g: len(g)>1能够在不同条件下过滤用户,正如我之前所说的。特别是过滤每月发生一次的用户。

回答

1

只要您的'Datetime'dtype已经是日期时间,并且您正在运行熊猫版本0.15.0或更高版本,那么除了用户标识之外,您还可以将该月除以该用户标识,然后通过检查组:

In [29]: 

df.groupby(['User_ID',df['Datetime'].dt.month]).filter(lambda x: len(x) > 1) 
Out[29]: 
    User_ID   Datetime 
0  1 2014-01-01 08:00:00 
1  1 2014-01-02 09:00:00 
2  2 2014-01-02 10:00:00 
3  2 2014-01-03 11:00:00 
+0

谢谢埃德!如果我想仅在几个月内过滤用户,该怎么办?我可以申请一些dt.month ==六月条件? – 2015-03-31 11:01:23

+0

我只是首先过滤df,而不是在groupby上做这个,如果这就是你想要的,我的意思是'df [df ['Datetime']。dt.month == 5]'会做同样的事情 – EdChum 2015-03-31 11:05:21