Python:如何基于地址、经纬度合并DataFrame并保留指定数据?
高效合并CSV并保留经纬度数据的解决方案
嘿,我完全懂你的困扰——手动写的Python代码跑起来慢得让人抓狂,还要精准保留之前的经纬度和原有列,同时整合新的房屋数据对吧?别慌,咱们用Pandas来搞定,这是处理这类数据合并最靠谱高效的工具,比你手动循环快N倍。
核心思路
咱们的目标是:保留新数据集的所有行(包括新增房屋),同时把旧数据里已有的经纬度和原有列精准匹配过来,既避免重复劳动,又保证处理效率。
具体步骤(附代码)
1. 导入工具并读取数据集
先确保你已经安装了Pandas(没装的话用pip install pandas一键搞定),然后读取两个CSV文件:
import pandas as pd # 读取带经纬度的旧数据集 old_data = pd.read_csv("你的旧数据集路径.csv") # 读取更新后的新数据集 new_data = pd.read_csv("你的新数据集路径.csv")
2. 确定唯一匹配标识
这一步是关键!你得找到一个能唯一识别每栋房屋的列,比如房屋ID、标准化后的地址(如果地址格式统一的话)。假设咱们用house_id作为唯一标识——如果用地址的话,记得先标准化格式,不然很容易匹配失败。
3. 提取旧数据中需要保留的内容
从旧数据里挑出咱们要留存的核心列:唯一标识 + 经纬度 + 你想保留的原有列:
# 示例:保留house_id、long、lat,以及原有列比如'house_type'、'build_year' old_retained = old_data[['house_id', 'long', 'lat', 'house_type', 'build_year']]
4. 高效合并数据集
用Pandas的join操作(先设置索引会大幅提升速度),这是底层优化过的逻辑,比手动循环快太多:
# 把唯一标识设为索引,加速合并过程 old_retained = old_retained.set_index('house_id') new_data = new_data.set_index('house_id') # 左连接:保留新数据的所有行,自动匹配旧数据的保留列 merged_data = new_data.join(old_retained, how='left').reset_index()
操作完成后:
- 新数据里原本就有的房屋,会自动从旧数据填充经纬度和原有列
- 新增的房屋,经纬度和原有列会显示为
NaN,后续你可以单独处理这些新增数据(比如批量地理编码)
5. 处理列名重复(可选)
如果新旧数据有重名的列(除了标识列),合并后会自动加后缀(比如_x是新数据的,_y是旧数据的)。你可以指定后缀,或者优先保留旧数据的列:
# 用merge时自定义后缀 merged_data = pd.merge(new_data, old_retained, on='house_id', how='left', suffixes=('_new', '_old')) # 优先保留旧数据的列值,没有旧值的用新值填充 merged_data['house_type'] = merged_data['house_type_old'].fillna(merged_data['house_type_new']) # 删掉重复的冗余列 merged_data = merged_data.drop(['house_type_old', 'house_type_new'], axis=1)
6. 标准化地址(如果用地址作为标识)
如果你的唯一标识是地址,一定要先标准化格式,避免因空格、大小写差异导致匹配失败:
def standardize_addr(addr): # 统一小写、去掉空格和逗号、清理多余字符 return addr.strip().lower().replace(' ', '').replace(',', '') # 给两个数据集添加标准化后的地址列 old_data['std_addr'] = old_data['address'].apply(standardize_addr) new_data['std_addr'] = new_data['address'].apply(standardize_addr) # 用标准化地址完成合并 old_retained = old_data[['std_addr', 'long', 'lat', 'house_type']].set_index('std_addr') merged_data = new_data.join(old_retained, on='std_addr', how='left').drop('std_addr', axis=1)
为什么这个方法快?
Pandas的合并操作是基于C语言实现的底层逻辑,比纯Python手动循环遍历的效率高几个量级,尤其是处理大数据集的时候,差距会特别明显。
内容的提问来源于stack exchange,提问作者Rebecca
相关产品推荐
相关产品推荐

