2016-09-29 5 views
1

Ich schreibe ein Stück des alten Codes mit Pandas um. Meine Datenrahmen sieht wie folgt aus:Pandas: Entfernen Sie doppelte Datensätze, während Sie den alten Wert im Datenrahmen als Referenz beibehalten

index stop_id stop_name stop_lat  stop_lon stop_id2 
0   A12  Some St 40.889248 -73.898583  None 
1   A14  Some St 40.889758 -73.908573  None 
2   B09  Some St 40.788924 -74.846576  None 
3   A22  Some St 40.889248 -73.898583  None 

Beachten Sie, dass stop_lat und stop_lon für stop_ids 'A12' dupliziert und 'A22'.

Ich möchte den doppelten Stop (stop_id = 'A22') während der Aktualisierung von stop_d2 mit dem stop_id des entfernten Datensatzes entfernen. So würde der Datenrahmen wie folgt aussehen:

index stop_id stop_name stop_lat  stop_lon stop_id2 
0   A12  Some St 40.889248 -73.898583  A22 
1   A14  Some St 40.889758 -73.908573  None 
2   B09  Some St 40.788924 -74.846576  None 

Früher habe ich diese Aufgabe arbeitete mit meinen Daten im Wörterbuch zu halten:

d={'A12':['Some St', 40.889248, -73.898583, None],'A14': ['Some St', 40.889758, -73.908573, None],'B09':['Some St, 40.788924,-74.846576, None], 'A22':['Some St', 40.889248, -73.898583, None]} 

if d['A12'][1]+d['A12'][2]==d['A22'][1]+d['A22'][2]: 
    del d['A22'] 
    d['A12'][-1]='A22' 

ich ähnliche Aufgabe in Pandas tun wollen. Ich weiß, wenn ich nur verwende: df = df.drop_duplicates (['stop_lat', 'stop_lon'])

Ich werde den doppelten Datensatz verlieren und wird nicht behalten seine ID.Ich muss ID der entfernt behalten Stoppen Sie für korrekte Metadaten.

Antwort

1
new_df = df[df.duplicated(subset = ['stop_lat', 'stop_lon'], keep='first')] 

duplicates_df = df[df.duplicated(subset = ['stop_lat', 'stop_lon'], keep = 'last')][['stop_lat', 'stop_lon', 'stop_id']] 

new_df.merge(duplicates_df, how='left', on=['stop_lat, 'stop_lon']) 
+0

Vielen Dank! Genau das, was ich brauchte! –

1

erhalten doppelte Maske

cols = ['stop_lat', 'stop_lon'] 
dups = df.duplicated(subset=cols) 

Teilmenge df mit Maske

nodups = df[~dups].set_index(cols) 

dups dupliziert werden kann, die mselves

first_dup = df[dups].drop_duplicates(subset=cols) 
first_dup = first_dup.set_index(cols).stop_id 

assign entsprechend

nodups.loc[first_dup.index, 'stop_id2'] = first_dup 
nodups 

enter image description here

+0

Dies ist eigentlich eine bessere Problemumgehung. Vielen Dank! –

Verwandte Themen