2015-03-04 11 views
7

Pracuję na DataFrame z User_IDs, obiektów DateTime oraz innych informacji, jak na poniższym wyciągu:pandy - Przechowywać wyłącznie prawdziwych wartości po GroupBy w 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 

Mam zgrupowanych Użytkownicy z:

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

a następnie sprawdzić na nie-single obiektów DATATIME:

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

jakie uzyskano następujące b oolean DataFrame:

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

co jest w porządku dla moich celów, aby zachować tylko User_ID z True zamaskowaną wartością. Teraz chciałbym zachować tylko wartości User_ID powiązane z wartościami True i zapisać je na przykład w nowej DataFrame z pandas.to_csv. Oczekiwany DataFrame będzie zawierać tylko user_id z więcej niż jednego obiektu 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 

Jak mogę mieć dostęp do logicznych wartości dla każdego user_id? Dzięki za twoją pomoc.

Odpowiedz

7

Przypisywanie wynik df.groupby('User_ID')['Datetime'].apply(lambda g: len(g)>1) do zmiennej, dzięki czemu można wykonać logiczną indeksowanie, a następnie użyć indeksu z tego nazwać isin i filtrować swoją oryg 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 

Można połączyć to_csv na powyższe jako normalny

+0

Great! Dzięki! Brakowało mi przypisania zmiennych do wykonania maskowania, dzięki! –

1

pierwsze, upewnij się, że nie mają zduplikowane wpisy:

df = df.drop_duplicates() 

następnie dowiedzieć się, th Liczy się dla każdego e:

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

wreszcie dowiedzieć się, gdzie indeksy pokrywają:

df[df.User_ID.isin(counts[counts > 1].index)] 
Powiązane problemy