Pandas合并完整交通DataFrame仅获4行,合并部分列却正常的问题求助
问题原因及排查方案
出现这种差异的核心原因是完整交通数据与你的临床数据集在census_tract列的匹配度极低,而你之前提取的两列数据是经过筛选(或格式修正)的,能完全匹配原数据的普查区代码。具体可能的原因及排查步骤如下:
1. 数据类型不匹配(最常见)
普查区代码通常是带前导零的字符串(比如"00123"),但完整交通数据的census_tract可能被Excel自动转成了数值类型(丢失前导零变成123),导致和原数据的字符串类型代码无法匹配,只有少数刚好不带前导零的代码能成功匹配(也就是你看到的4行)。
排查&修复:
检查两列的数据类型并统一为字符串:
# 转换为字符串并去除可能的空格 df_my_data['census_tract'] = df_my_data['census_tract'].astype(str).str.strip() df_transportation_data['census_tract'] = df_transportation_data['census_tract'].astype(str).str.strip() # 重新执行合并 df_merged_file = pd.merge(df_my_data, df_transportation_data, on=['census_tract'])
2. 完整交通数据的census_tract仅包含4个与原数据重叠的普查区
你之前提取的两列数据可能是手动筛选过的(比如只导出了和你的临床数据匹配的行),但完整交通数据本身的普查区覆盖范围极小,只有4个代码和你的657行数据重叠,所以内连接(默认的merge方式)后只保留4行。
排查:
查看完整交通数据中与原数据匹配的普查区数量:
# 获取原数据的普查区集合 my_tracts = set(df_my_data['census_tract'].astype(str).str.strip()) # 筛选交通数据中匹配的行 matched_rows = df_transportation_data[df_transportation_data['census_tract'].astype(str).str.strip().isin(my_tracts)] # 输出匹配信息 print(f"交通数据中与原数据匹配的普查区数量:{len(matched_rows['census_tract'].unique())}") print(f"交通数据中匹配的总行数:{len(matched_rows)}")
如果输出的匹配普查区数量是4,说明确实只有这4个重叠的代码。
3. 完整交通数据存在脏数据
比如部分行的census_tract是空值、NaN或格式错误(如带特殊字符),导致大部分行无法参与匹配。而你提取的两列数据已经过滤了这些脏数据。
排查:
检查交通数据中census_tract的空值或异常值:
# 查看空值数量 print(f"交通数据中census_tract空值数量:{df_transportation_data['census_tract'].isna().sum()}") # 查看非字符串类型的异常值(如果已转字符串则跳过) print(f"交通数据中census_tract非字符串值数量:{len(df_transportation_data[~df_transportation_data['census_tract'].apply(lambda x: isinstance(x, str))])}")
补充:调整合并方式
如果你想保留原数据的所有657行(即使没有匹配的交通数据),可以使用左连接:
df_merged_file = pd.merge(df_my_data, df_transportation_data, on=['census_tract'], how='left')
此时未匹配的交通数据列会显示NaN,方便后续处理。
内容的提问来源于stack exchange,提问作者Toby Ortega
相关产品推荐
相关产品推荐

