2015-03-04 9 views
7

Ich habe mit benutzerkennungen auf einem Datenrahmen arbeiten, Datetime-Objekte und andere Informationen, wie der folgende Auszug:Pandas - halten nur wahre Werte nach groupby einem Datenrahmen

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 

ich mit Benutzern gruppiert haben:

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

und dann prüfen, für No-Single Datatime-Objekte:

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

ich habe folgende b erhalten oolean Datenrahmen:

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

und das ist gut für meine Zwecke nur User_ID mit einem wahren maskierten Wert zu halten. Jetzt möchte ich nur die User_ID-Werte beibehalten, die den True-Werten zugeordnet sind, und sie beispielsweise in einen neuen DataFrame mit pandas.to_csv schreiben. Der erwartete Datenrahmen würde nur die User_ID mit mehr als einem Datetime-Objekt enthält:

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 

Wie kann ich den Zugriff auf die Boolesche Werte für jeden User_ID haben? Danke für Ihre freundliche Hilfe.

Antwort

7

das Ergebnis df.groupby('User_ID')['Datetime'].apply(lambda g: len(g)>1) einer Variablen zuweisen, so dass Sie boolean Indizierung durchführen kann und dann den Index aus dieser Verwendung isin aufrufen und filtern Sie Ihre orig df:

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 

Sie können dann to_csv auf der oben nennen als normale

+0

Great! Vielen Dank! Mir fehlte die variable Zuweisung, um die Maskierung durchzuführen, danke! –

1

zuerst, stellen Sie sicher, dass Sie keine doppelten Einträge haben:

df = df.drop_duplicates() 

dann, herauszufinden, th e zählt für jeden:

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

schließlich herausfinden, wo die Indizes überlappen:

df[df.User_ID.isin(counts[counts > 1].index)] 
Verwandte Themen