python - 将整数 values 映射到由第二个 dataframe Pandas 中的整数范围定义的类别

我正在尝试将给定数据框的 zip_codes 映射到第二个数据框提供的区域。区域由整数范围定义(例如,范围 1000-1299 是北荷兰,1300-1379 是弗莱沃兰等)。数据如下所示:

df1
  zip_code  state_name
0   7514    None
1   7891    None
2   2681    None
3   7606    None
4   5051    None
5   2611    None
6   4341    None
7   1851    None
8   1861    None
9   2715    None

df2
    zpcd1   zpcd2   region
0   1000    1299    Noord-Holland
1   1300    1379    Flevoland
2   1380    1384    Noord-Holland
3   1390    1393    Utrecht
4   1394    1494    Noord-Holland
5   1396    1496    Utrecht
6   1398    1425    Noord-Holland
7   1426    1427    Utrecht
8   1428    1429    Zuid-Holland
9   1430    2158    Noord-Holland

重复区域是可以的,因为一个区域可以有不同的邮政编码范围。

问题是:如何将 df1 中的邮政编码 values 映射到 df2 中定义的范围,以便将区域名称分配给该行?

我试过了

def region_map(row):
    global df2
    if row['zip_code'] in range(nlreg.zpcd1, nlreg.zpcd2, 1):
        return df2.region

df1['state_name'] = df1.apply(lambda row: region_map(row))

但它返回一个 KeyError:'zip_code'。先感谢您

编辑

我得到了我正在寻找的结果

df2['zip_c_range']=list(zip(df2.zpcd1, df2.zpcd2))
for i,v in tqdm(df1.zip_code.items()):
    for x,z in df2.zip_c_range.items():
        if v in range(*z):
            df1['state_name'][i]=df2.region[x]

但我确信使用 lambda 会有更好的解决方案。

回答1

我认为您正在尝试执行以下操作(nlreg 为 df2):

def region_map(zc):
    return nlreg.loc[(nlreg['zpcd1'] <= zc) & (zc <= nlreg['zpcd2']), 'region']

df1['state_name'] = df1['zip_code'].apply(lambda z: region_map(z))

相似文章

最新文章