匹配2个数据帧的列值

2024-10-08 18:30:47 发布

您现在位置:Python中文网/ 问答频道 /正文

设置

我有2个数据帧:

  1. df_ads:每一行包含一个废弃房屋广告的信息,df_ads['ad_post_code']包含广告的荷兰邮政编码。你知道吗
  2. df_mapping:邮政编码和NUTS3地区之间的映射

我需要把每个广告的邮政编码映射到它的地区。你知道吗


数据帧

df_ads['ad_post_code']看起来像

0                1567 JA
1                3893 GB
2                5091 BE
3                1087 MB
4                7905 GW
5                5121 ZH

其中len(df_ads['ad_post_code']) = 85447。你知道吗

df_mapping看起来像

      CODE NUTS_3
0     1011  NL326
1     1012  NL326
2     1013  NL326
3     1014  NL326
4     1015  NL326
5     1016  NL326

其中,len(df_mapping) = 4074df_mapping['CODE']显示荷兰邮政编码的前4个字符,df_mapping['NUTS_3']是邮政编码的NUTS3区域。你知道吗

换句话说,邮政编码1011属于NL326地区。你知道吗


问题

我做了一些简单的循环,将df_ads中的广告映射到NUTS3区域。但是,我似乎无法编写正确的循环设置。你知道吗

nuts3_map = []

# insert postal codes into list
for i in range(0,len(df_ads)):

    postal_code_ad = df_ads['ad_post_code'].iloc[i].split()[0]

    for j in range(0,len(df_mapping)):

        postal_code_map = str(df_mapping['CODE'].iloc[j])

        # check if postal code match
        if postal_code_ad == postal_code_map:

            nuts3_map.append(df_mapping['NUTS_3'].iloc[j])

            break
    continue

运行这个函数会得到len(nuts3_map) = 85353,而len(df_ads) = 85448,因此df_ads['nuts3'] = nuts3会得到ValueError: Length of values does not match length of index。你知道吗

双for循环是最快的方法吗?如果是这样,如何修复for循环以使其正常工作?你知道吗


Tags: mapdfforlencodepostmappingad
1条回答
网友
1楼 · 发布于 2024-10-08 18:30:47

我首先在df_ads中创建另一列:

# If `df_mapping['CODE']` is `int`
df_ads['CODE'] = df_ads['ad_post_code'].apply(lambda x: int(x[:4]))

# If `df_mapping['CODE']` is `str`
# df_ads['CODE'] = df_ads['ad_post_code'].apply(lambda x: x[:4])

然后我将使用^{}执行两个数据帧的内部合并:

df_ads.merge(df_mapping, left_on='CODE', right_on='CODE', how='inner')

我冒昧地修改了您的数据以产生一个可行的示例:

# df_ads['ad_post_code']
0    1567 JA
1    3893 GB
2    5091 BE
3    1087 MB
4    7905 GW
5    5121 ZH
6    1011 XX

# df_mapping
   CODE NUTS_3
0  1011  NL326
1  1012  NL326
2  1013  NL326
3  1014  NL326
4  1015  NL326
5  1016  NL326
6  1567  XSFDF

输出:

  ad_post_code  CODE NUTS_3
0      1567 JA  1567  XSFDF
1      1011 XX  1011  NL326

如果df_ads['CODE']中的每一个代码都存在于df_mapping['CODE']中,那么您应该得到正确的输出。你知道吗

编辑

如果您想知道df_mapping中的列表是否完整,可以执行以下操作:

测向_广告地址[np.U不(df_ads['CODE'].isin(df_mapping['CODE'])]

缺少数据:

   ad_post_code  CODE
id                   
1       3893 GB  3893
2       5091 BE  5091
3       1087 MB  1087
4       7905 GW  7905
5       5121 ZH  5121

相关问题 更多 >

    热门问题