请求:基于邮政编码匹配合并两个Excel DataFrame的简易实现
如何用基础Python方法按邮政编码匹配合并两个Excel DataFrame
没问题,我明白你想避开geopandas这类库或者API,用最基础的逻辑来实现这个匹配合并需求——把df2里对应邮政编码的单行坐标数据,复制到df1里同邮编的每一行中。其实用字典做快速查找+循环遍历就能轻松搞定,完全符合你想要的简单方式,下面是具体的实现步骤和代码:
第一步:先创建示例数据(模拟你的Excel表格)
首先我们用pandas把你给出的示例数据转换成DataFrame,如果你是从Excel读取的话,只需要把这部分换成pd.read_excel()即可:
import pandas as pd # 模拟你的dataframe1(从Excel读取的话用pd.read_excel("你的文件路径.xlsx")) data1 = { 'postcode': [2000, 2000, 2001, 2001, 2001, 2004], 'price': [150, 250, 350, 550, 650, 750], 'type': ['A', 'B', 'C', 'A', 'B', 'C'] } df1 = pd.DataFrame(data1) # 模拟你的dataframe2 data2 = { 'postcode': [2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011], 'lat': [1.2, 1.3, 1.5, 1.6, 1.7, 1.9, 1.2, 1.3, 1.5, 1.6, 1.7, 1.9], 'lon': [1.2, 1.5, 1.2, 1.5, 1.8, 1.98, 1.2, 1.5, 1.2, 1.5, 1.8, 1.98] } df2 = pd.DataFrame(data2)
第二步:把df2转成字典用于快速查找
我们先把df2里的邮政编码和对应的经纬度做成一个字典,这样后续查找的时候速度会非常快,不用每次都遍历整个df2:
# 构建邮政编码到经纬度的映射字典 postcode_coords = {} for _, row in df2.iterrows(): postcode = row['postcode'] # 把lat和lon存成元组作为字典的值 postcode_coords[postcode] = (row['lat'], row['lon'])
第三步:遍历df1,匹配并添加经纬度
接下来我们遍历df1的每一行,用if判断当前行的邮政编码是否在字典里,如果存在就把对应的经纬度填进去:
# 先给df1新增lat和lon列,初始值设为None df1['lat'] = None df1['lon'] = None # 遍历df1的每一行进行匹配 for idx, row in df1.iterrows(): current_postcode = row['postcode'] # 检查当前邮政编码是否在我们的映射字典里 if current_postcode in postcode_coords: # 如果匹配到,就把对应的lat和lon赋值到当前行 df1.at[idx, 'lat'], df1.at[idx, 'lon'] = postcode_coords[current_postcode]
最终结果
运行完上面的代码后,你打印df1就能得到你想要的合并结果:
print(df1)
输出结果和你给出的示例完全一致:
postcode price type lat lon 0 2000 150 A 1.2 1.2 1 2000 250 B 1.2 1.2 2 2001 350 C 1.3 1.5 3 2001 550 A 1.3 1.5 4 2001 650 B 1.3 1.5 5 2004 750 C 1.7 1.8
额外说明
如果df1里存在df2没有的邮政编码,对应的lat和lon会是None,你可以根据需求选择删除这些行(用df1 = df1.dropna(subset=['lat', 'lon']))或者填充默认值。
内容的提问来源于stack exchange,提问作者Zack
相关产品推荐
相关产品推荐

