2015-03-31 2 views
1

Я работаю с DataFrame вроде следующего:панды - как фильтровать «наиболее частые» объекты 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 

Я хотел бы отфильтровать пользователей при определенных условиях на основе столбцов кодировки даты и времени, например, фильтровать только пользователей с одного вхождения/месяц, или только пользователей с вхождений только в летнее время и т.д.

До сих пор я группе ДХ с:

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 Datetime уже является датой, и вы используете версию pandas 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

Thanks Ed! Что делать, если я хочу фильтровать пользователей с появлением только через несколько месяцев? Могу ли я применить некоторые условия dt.month == june? –

+0

Я бы просто отфильтровал df, скорее сделаю это в группе, если это то, что вы хотели, я имею в виду для этого случая: 'df [df ['Datetime']. Dt.month == 5]' будет делать то же самое – EdChum