如何基于另一DataFrame筛选邮编匹配且表计数量差±2的行
问题与解决思路
现有数据
DataFrame 1: studyarea_pcdn
POSTCODE Number of meters 0 NE4 9UP 41 1 NE4 9UN 32 2 NE4 9UL 29 3 NE4 9EN 27 4 NE4 9DY 25 5 NE4 9ED 22 6 NE4 9EL 18 7 NE4 9EE 13 8 NE4 9UJ 11 9 NE4 9DX 6 10 NE4 9EA 4
DataFrame 2: sa_gas_pcd_2018 指定列子集
POSTCODE Number of meters 628318 NE4 9UP 41 628315 NE4 9UJ 36 628317 NE4 9UN 32 628199 NE4 9DY 29 628201 NE4 9EE 28 628316 NE4 9UL 28 628205 NE4 9EN 26 628200 NE4 9ED 20 628198 NE4 9DX 19 628204 NE4 9EL 17
筛选要求
需从sa_gas_pcd_2018子集中筛选满足以下条件的行:
POSTCODE与studyarea_pcdn中的POSTCODE完全匹配- 该行
Number of meters与studyarea_pcdn对应POSTCODE的数值差值在±2范围内
预期结果
POSTCODE Number of meters 628318 NE4 9UP 41 628317 NE4 9UN 32 628316 NE4 9UL 28 628205 NE4 9EN 26 628200 NE4 9ED 20 628204 NE4 9EL 17
解决思路与代码实现
方法1:合并DataFrame后筛选
通过内连接自动过滤不匹配的POSTCODE,再计算差值筛选:
# 重命名参考表的meter列,避免合并冲突 study_ref = studyarea_pcdn.rename(columns={'Number of meters': 'meter_ref'}) # 保留原数据集的索引,方便后续恢复 sa_subset = sa_gas_pcd_2018[['POSTCODE', 'Number of meters']].reset_index(names='original_idx') # 内连接,只保留POSTCODE匹配的行 merged = sa_subset.merge(study_ref, on='POSTCODE', how='inner') # 筛选差值在±2范围内的行 filtered = merged[abs(merged['Number of meters'] - merged['meter_ref']) <= 2] # 恢复原索引并保留目标列 result = filtered.set_index('original_idx')[['POSTCODE', 'Number of meters']] print(result)
方法2:用字典映射匹配参考值
先构建POSTCODE到参考meter值的映射,再逐行匹配筛选:
# 创建POSTCODE与参考meter值的字典映射 meter_map = studyarea_pcdn.set_index('POSTCODE')['Number of meters'].to_dict() sa_subset = sa_gas_pcd_2018[['POSTCODE', 'Number of meters']] # 添加参考值列,自动过滤不匹配的POSTCODE(对应值为NaN) sa_subset['meter_ref'] = sa_subset['POSTCODE'].map(meter_map) # 筛选条件:参考值存在且差值符合要求 filtered = sa_subset.dropna(subset=['meter_ref'])[abs(sa_subset['Number of meters'] - sa_subset['meter_ref']) <= 2] # 移除参考列得到最终结果 result = filtered.drop(columns=['meter_ref']) print(result)
内容的提问来源于stack exchange,提问作者Carlos_C
相关产品推荐
相关产品推荐

