2015-03-04 4 views
7

я работал на DataFrame с User_IDs, объекты DateTime и другую информацию, например, следующий отрывок:панды - держать только Истинные значения после GroupBy в DataFrame

User_ID;Latitude;Longitude;Datetime 
222583401;41.4020375;2.1478710;2014-07-06 20:49:20 
287280509;41.3671346;2.0793115;2013-01-30 09:25:47 
329757763;41.5453577;2.1175164;2012-09-25 08:40:59 
189757330;41.5844998;2.5621569;2013-10-01 11:55:20 
624921653;41.5931846;2.3030671;2013-07-09 20:12:20 
414673119;41.5550136;2.0965829;2014-02-24 20:15:30 
414673119;41.5550136;2.0975829;2014-02-24 20:16:30 
414673119;41.5550136;2.0985829;2014-02-24 20:17:30 

Я сгруппированных пользователей с:

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

, а затем проверить не-отдельных объектов DataTime:

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

Я получил следующее б oolean DataFrame:

User_ID 
189757330 False 
222583401 False 
287280509 False 
329757763 False 
414673119  True 
624921653 False 
Name: Datetime, dtype: bool 

, который прекрасно подходит для моих целей, чтобы только user_id с Истинным замаскированным значением. Теперь я хотел бы сохранить только значения User_ID, связанные с значениями True, и записать их в новый DataFrame с pandas.to_csv, например. Ожидаемая DataFrame будет содержать только user_id с более чем одного объекта DateTime:

User_ID;Latitude;Longitude;Datetime 
414673119;41.5550136;2.0965829;2014-02-24 20:15:30 
414673119;41.5550136;2.0975829;2014-02-24 20:16:30 
414673119;41.5550136;2.0985829;2014-02-24 20:17:30 

Как я могу получить доступ к булевы значения для каждого user_id? Спасибо за вашу любезную помощь.

ответ

7

Присвоить результат df.groupby('User_ID')['Datetime'].apply(lambda g: len(g)>1) переменной, так что вы можете выполнить логическое индексирование, а затем использовать индекс от этого вызвать isin и отфильтровать ваш ориг ДФ:

In [366]: 

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

Out[366]: 
User_ID 
189757330 False 
222583401 False 
287280509 False 
329757763 False 
414673119  True 
624921653 False 
Name: Datetime, dtype: bool 

In [367]: 
users[users] 

Out[367]: 
User_ID 
414673119 True 
Name: Datetime, dtype: bool 

In [368]: 
users[users].index 

Out[368]: 
Int64Index([414673119], dtype='int64') 

In [361]: 
df[df['User_ID'].isin(users[users].index)] 

Out[361]: 
    User_ID Latitude Longitude   Datetime 
5 414673119 41.555014 2.096583 2014-02-24 20:15:30 
6 414673119 41.555014 2.097583 2014-02-24 20:16:30 
7 414673119 41.555014 2.098583 2014-02-24 20:17:30 

Вы можете позвонить to_csv на выше, нормальный

+0

Отлично! Благодаря! Мне не хватало назначения переменной для выполнения маскировки, спасибо! –

1

первый, убедитесь, что у вас нет повторяющихся записей:

df = df.drop_duplicates() 

затем выяснить тыс е счета для каждого:

counts = df.groupby('User_ID').Datetime.count() 

наконец, выяснить, где индексы перекрытия:

df[df.User_ID.isin(counts[counts > 1].index)] 
Смежные вопросы