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
相关产品推荐
相关产品推荐

