2016-10-05 7 views
1

Ich habe timestamp und id Variablen in meiner Datenrahmen (df)Finding doppelte Zeilen Python

timestamp     id 
2016-06-09 8:33:37   a1 
2016-06-09 8:33:37   a1 
2016-06-09 8:33:38   a1 
2016-06-09 8:33:39   a1 
2016-06-09 8:33:39   a1 
2016-06-09 8:33:37   b1 
2016-06-09 8:33:38   b1 

Jeder id kann nicht zwei Zeitstempel haben. Ich muss diese doppelten Zeitstempel für jede id drucken. In meinem obigen Fall sollte die Ausgabe für die Zeilen sein 1,2,4,5

Der folgende Code gibt die doppelte timestamp

set([x for x in df['timestamp'] if df['timestamp'].count(x) > 1]) 

Wie id prüfen zusammen mit timestamp die doppelten Zeilen haben?

Antwort

0

Wenn Sie alle Duplikate finden wollen, dann verwenden Sie die duplicated Methode. Es funktioniert nur auf den Spalten. Auf der anderen Seite arbeitet df.index.duplicated auf dem Index. Daher machen wir eine schnelle reset_index, um den Index in die Spalten zu bringen.

df = df.reset_index() 
df.ix[df.duplicated(keep=False)] 

    index    id 
0 2016-06-09 8:33:37 a1 
1 2016-06-09 8:33:37 a1 
3 2016-06-09 8:33:39 a1 
4 2016-06-09 8:33:39 a1 

Wenn Sie möchten nur Duplikate entfernen gibt es die Datenrahmen Methode drop_duplicates.

df = df.reset_index() 
df = df.drop_duplicates() # keep='first' by default. 

    index    id 
0 2016-06-09 8:33:37 a1 
2 2016-06-09 8:33:38 a1 
3 2016-06-09 8:33:39 a1 
5 2016-06-09 8:33:37 b1 
6 2016-06-09 8:33:38 b1 

Wenn Sie dann Ihren alten Index zurück set_index für eine der über dem Standardspalten Namen ‚index‘ verwenden, dann verwenden Sie einfach.

df.set_index('index') 

        id 
index    
2016-06-09 8:33:37 a1 
2016-06-09 8:33:38 a1 
2016-06-09 8:33:39 a1 
2016-06-09 8:33:37 b1 
2016-06-09 8:33:38 b1 

Die oben genannten Methoden können Sie wählen, ob die erste, letzte oder keine der Duplikate zu halten, indem das keep Attribut 'first', 'last' oder False Einstellung. Um alle Duplikate in df zu entfernen, verwenden Sie dann keep=False.

1

Sie können groupby verwenden und Maske aller Duplikate Werte pro Gruppe von Series.duplicated erhalten. Letzte Nutzung boolean indexing:

print (df.groupby(['id'])['timestamp'].apply(lambda x: x.duplicated(keep=False))) 
0  True 
1  True 
2 False 
3  True 
4  True 
5 False 
6 False 
Name: timestamp, dtype: bool 

print (df[df.groupby(['id'])['timestamp'].apply(lambda x: x.duplicated(keep=False))]) 
      timestamp id 
0 2016-06-09 08:33:37 a1 
1 2016-06-09 08:33:37 a1 
3 2016-06-09 08:33:39 a1 
4 2016-06-09 08:33:39 a1 
+0

Das funktioniert !! Vielen Dank. – sshr