如何基于复合键合并Pandas中的坐标DataFrame?
解决Pandas合并时的KeyError及长格式坐标合并问题
1. 修复KeyError问题
出现KeyError: 'Incident_Number'的核心原因是melt操作时丢失了Incident_Number列。默认情况下melt()会把所有未指定的列转为值列,必须通过id_vars参数明确保留Incident_Number作为标识列。
示例代码(修复melt步骤):
# 假设原始宽表为df_coords,包含Incident_Number、Latitude、Longitude列 df_coords_long = df_coords.melt( id_vars=['Incident_Number'], # 必须指定,保留合并所需的键列 var_name='Coord_Type', # 可选,标记当前行是纬度还是经度(比如"Latitude"/"Longitude") value_name='GeoCodeCoordinates' # 目标列名,对应需求 )
执行后用print(df_coords_long.columns)确认Incident_Number列存在。
另外需排查列名一致性:
- 检查两个待合并表的Incident_Number列名是否完全一致(注意大小写、空格、特殊字符,比如
Incident Number和Incident_Number是不同列) - 若列名不一致,用
df.rename(columns={'原列名': 'Incident_Number'}, inplace=True)统一
2. 正确执行合并(支持NaN填充)
因两表记录数不等,需用**外连接(how='outer')**保留两边所有记录,缺失的GeoCodeCoordinates会自动填充NaN。
场景1:仅基于Incident_Number合并
如果目标是将长格式的坐标数据关联到主表的每个事件记录(每个事件会生成两行,分别对应纬度、经度):
# df_main是需添加GeoCodeCoordinates的目标表,需包含Incident_Number列 merged_df = pd.merge( df_main, df_coords_long, on='Incident_Number', how='outer' # 外连接保留所有记录,缺失值填充NaN )
场景2:基于Incident_Number+坐标类型的复合键合并
如果目标表也是长格式(按事件+坐标类型拆分),需用复合键确保纬度、经度精准匹配:
# 假设df_main_long包含Incident_Number和Coord_Type列 merged_df = pd.merge( df_main_long, df_coords_long, on=['Incident_Number', 'Coord_Type'], how='outer' )
关键注意事项
- 合并前确认两个表的键列无缺失值(若有缺失,可先用
df.dropna(subset=['Incident_Number'])清理,或保留缺失值等待合并后填充) - 若需控制合并后的列顺序,可手动指定
merged_df = merged_df[['Incident_Number', 'GeoCodeCoordinates', ...]]
内容的提问来源于stack exchange,提问作者TravisB
相关产品推荐
相关产品推荐

