如何检测DataFrame中嵌套数据结构内的GPS数据重复项
检测DataFrame事件列中GPS数据的重复值
我的DataFrame中events列存储着事件列表,需要检测这些事件里的GPS数据(latitude和longitude)是否存在重复,DataFrame结构如下:
| deviceId | insertTime | events |
|---|---|---|
| 1234567 | 1686261264478 | [{'deviceDetailsDataModel': {'deviceId': '1234567'}, 'eventDateTime': '1686261000937', 'gpsDataModel': {'latitude': '38.0436213', 'longitude': '-90.5173831'}}, {'deviceDetailsDataModel': {'deviceId': '1234567'}, 'eventDateTime': '1686261001954', 'gpsDataModel': {'latitude': '38.0436203', 'longitude': '-90.5172008'}}, ...(后续事件均含唯一GPS数据)] |
| 456789 | 1686261264478 | [{'deviceDetailsDataModel': {'deviceId': '456789'}, 'eventDateTime': '1686261000937', 'gpsDataModel': {'latitude': '38.0436213', 'longitude': '-90.5173831'}}, ...(其中第15、16个事件GPS数据完全相同,最后两个事件无GPS数据)] |
实现方案
1. 展开事件列表并提取GPS数据
先把events列的列表拆分为单独行,提取每个事件的GPS经纬度,过滤掉不含GPS数据的事件:
import pandas as pd # 假设你的DataFrame名为df # 展开events列 exploded_df = df.explode('events', ignore_index=True) # 提取GPS经纬度,无GPS数据的记为NaN exploded_df['latitude'] = exploded_df['events'].apply(lambda x: x.get('gpsDataModel', {}).get('latitude')) exploded_df['longitude'] = exploded_df['events'].apply(lambda x: x.get('gpsDataModel', {}).get('longitude')) # 过滤掉无GPS数据的行 gps_df = exploded_df.dropna(subset=['latitude', 'longitude']).copy()
2. 检测重复GPS数据
可以针对两种场景检测重复:
场景1:单设备内的GPS重复
找出同一设备下重复出现的GPS组合:
device_duplicates = gps_df[gps_df.duplicated(subset=['deviceId', 'latitude', 'longitude'], keep=False)] print("单设备内重复的GPS数据:") print(device_duplicates[['deviceId', 'latitude', 'longitude', 'events']])
场景2:跨设备的GPS重复
找出全数据集中重复出现的GPS组合(不区分设备):
global_duplicates = gps_df[gps_df.duplicated(subset=['latitude', 'longitude'], keep=False)] print("\n跨设备重复的GPS数据:") print(global_duplicates[['deviceId', 'latitude', 'longitude', 'events']])
3. 统计重复次数(可选)
如果需要统计每个重复GPS的出现次数:
# 单设备内重复次数统计 device_dup_counts = gps_df.groupby(['deviceId', 'latitude', 'longitude']).size().reset_index(name='重复次数') device_dup_counts = device_dup_counts[device_dup_counts['重复次数'] > 1] print("\n单设备内GPS重复次数统计:") print(device_dup_counts) # 跨设备重复次数统计 global_dup_counts = gps_df.groupby(['latitude', 'longitude']).size().reset_index(name='重复次数') global_dup_counts = global_dup_counts[global_dup_counts['重复次数'] > 1] print("\n跨设备GPS重复次数统计:") print(global_dup_counts)
内容的提问来源于stack exchange,提问作者sman
相关产品推荐
相关产品推荐

