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

Python实现两DataFrame匹配后向SixtyOne追加lat和lon列

解决方案

嘿,这个需求用pandas的merge方法就能轻松搞定,我给你一步步拆解:

完整代码示例

import pandas as pd

# 先创建你给出的两个DataFrame
AllBusStops = pd.DataFrame({
    'CommonName': ['Cambuslang Road', 'Hillsborough Road'],
    'lon': [-4.17351, -4.12914],
    'lat': [55.82932, 55.85388]
})

SixtyOne = pd.DataFrame({
    'Name': ['Canonbie Street', 'Hillsborough Road']
})

# 执行匹配合并:保留SixtyOne的所有行,匹配AllBusStops中的lat和lon
result = pd.merge(
    SixtyOne,
    AllBusStops[['CommonName', 'lat', 'lon']],  # 只取需要的列,避免冗余
    left_on='Name',  # SixtyOne中用于匹配的列
    right_on='CommonName',  # AllBusStops中用于匹配的列
    how='left'  # 左连接:保留SixtyOne的所有行,匹配到的填充lat/lon,没匹配到的留空
).drop(columns='CommonName')  # 删除多余的CommonName列

print(result)

输出结果

Name      lat      lon
0  Canonbie Street      NaN      NaN
1  Hillsborough Road  55.85388 -4.12914

关键细节说明

  • how='left'是核心:这样能保证SixtyOne里的每一行都被保留,不管有没有匹配到AllBusStops的数据,没匹配到的lat和lon会显示为NaN;如果你只想保留匹配成功的行,可以改成how='inner'。
  • 我们只选择了AllBusStops里的CommonName、lat、lon列来合并,避免把不需要的列带进来,最后再删掉重复的CommonName列,让结果更整洁。
  • 如果你遇到的是模糊匹配(比如SixtyOne里的Name是Hillsborough Road...这种带省略的情况),可以用str.contains来做匹配,示例代码大概是这样:
# 模糊匹配的情况(假设SixtyOne的Name包含AllBusStops的CommonName前缀)
SixtyOne['lat'] = SixtyOne['Name'].apply(
    lambda x: AllBusStops[AllBusStops['CommonName'].str.contains(x.split('...')[0])]['lat'].values[0] 
    if len(AllBusStops[AllBusStops['CommonName'].str.contains(x.split('...')[0])]) > 0 
    else None
)
SixtyOne['lon'] = SixtyOne['Name'].apply(
    lambda x: AllBusStops[AllBusStops['CommonName'].str.contains(x.split('...')[0])]['lon'].values[0] 
    if len(AllBusStops[AllBusStops['CommonName'].str.contains(x.split('...')[0])]) > 0 
    else None
)

不过这种模糊匹配要注意精度,最好先确认字符串的匹配规则哦。

内容的提问来源于stack exchange,提问作者Alexander Caskie

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 09:20:46