如何在Pandas中拆分分组过滤结果为两个DataFrame(避免重复过滤)
高效拆分大型分组数据集为合规/不合规两个DataFrame
需求背景
我有一个大型轨迹数据集,需要过滤移除连续点间距超过0.02度的轨迹分组,同时要把被移除的分组单独存入一个DataFrame,用于后续人工标记跟进。由于绝大多数分组都是合规的,不想复制整个数据集,也不想用两次过滤(一次取反拿不合规组、一次拿合规组)的冗余方式,希望找更直接的拆分方法。当前代码只能保留合规分组,无法获取被移除的分组:
max_difference_degrees = 0.02 if filter_spurious_points: tracks = tracks.groupby('trackid').filter(lambda df: df[['longitude', 'latitude']].diff().abs().max(axis=1).max(axis=0) < max_difference_degrees)
解决方案:先标记分组合规性,再拆分
核心是只计算一次分组的合规性,用标记来拆分数据集,避免重复计算和全量复制:
max_difference_degrees = 0.02 if filter_spurious_points: # 1. 计算每个trackid的合规状态:index为trackid,值为布尔值(True=合规) track_validity = tracks.groupby('trackid').apply( lambda df: df[['longitude', 'latitude']].diff().abs().max(axis=1).max(axis=0) < max_difference_degrees ) # 2. 提取合规/不合规的trackid列表 valid_ids = track_validity[track_validity].index invalid_ids = track_validity[~track_validity].index # 3. 从原数据集筛选对应分组,生成两个DataFrame valid_tracks = tracks[tracks['trackid'].isin(valid_ids)] invalid_tracks = tracks[tracks['trackid'].isin(invalid_ids)]
优势说明
- 只计算一次分组合规性,比两次
filter少一轮重复运算,效率更高 - 用
isin()筛选行,无需复制整个数据集,适合处理大型数据 - 同时得到合规数据集和待标记的不合规数据集,完全满足需求
内容的提问来源于stack exchange,提问作者Harvey Williams
相关产品推荐
相关产品推荐

