2016-09-29 21 views
1

私はパンダを使用して古いコードを書き直しています。私のデータフレームは、次のようになります。stop_latとstop_lonパンダ:参照のためにデータフレームに古い値を保持しながら重複レコードを削除します

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 

注stop_ids「A12」と「A22」のために複製されています。

削除されたレコードのstop_idを使用してstop_d2を更新する際に、重複した停止(stop_id = 'A22')を削除したいとします。だから、データフレームは次のようになります。

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 

以前私は辞書に私のデータを保持したまま、この作業をしてきました:

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' 

私はパンダに似たタスクを実行したいです。 df = df.drop_duplicates(['stop_lat'、 'stop_lon'])

重複したレコードを失い、そのIDを保持しません。削除されたIDを保持する必要があります適切なメタデータを停止します。

答えて

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

!ちょうど私が必要なもの! –

1

マスクとdfを

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

のDUPが重複してもよい

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

サブセット重複マスクを得ます多くのおかげでmselves

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

に応じて割り当て

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

enter image description here

+0

これは実際にはより良い回避策です。ありがとう! –

関連する問題