You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 07:30:02