匹配 2 个数据框的熊猫列值

设置

我有 2 个熊猫数据框:

  1. df_ads:每一行都包含一个已抓取的房屋广告的信息,并df_ads['ad_post_code']包含该广告的荷兰邮政编码。

  2. df_mapping:邮政编码和NUTS3区域之间的映射

我需要将每个广告的邮政编码映射到其 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) = 4074,df_mapping['CODE']显示荷兰邮政编码的前 4 个字符,df_mapping['NUTS_3']是邮政编码的 NUTS3 区域。


换句话说,邮政编码1011属于 NUTS3 区域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

运行 this 给出len(nuts3_map) = 85353while len(df_ads) = 85448,这样df_ads['nuts3'] = nuts3给出ValueError: Length of values does not match length of index。


双循环是最快的方法吗?如果是这样,我如何修复我的 for 循环,使其一切正常?


湖上湖
浏览 111回答 1
1回答

弑天下

我将首先在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])然后我将DataFrame.merge用来执行两个数据帧的内部合并:df_ads.merge(df_mapping, left_on='CODE', right_on='CODE', how='inner')我冒昧地修改您的数据以生成一个可行的示例:# df_ads['ad_post_code']0    1567 JA1    3893 GB2    5091 BE3    1087 MB4    7905 GW5    5121 ZH6    1011 XX# df_mapping   CODE NUTS_30  1011  NL3261  1012  NL3262  1013  NL3263  1014  NL3264  1015  NL3265  1016  NL3266  1567  XSFDF输出:  ad_post_code  CODE NUTS_30      1567 JA  1567  XSFDF1      1011 XX  1011  NL326如果每个代码都df_ads['CODE']存在,df_mapping['CODE']那么你应该得到正确的输出。编辑如果你想知道列表中的df_mapping是否完整,你可以这样做:df_ads.loc[np.logical_not(df_ads['CODE'].isin(df_mapping['CODE']))]缺失数据:   ad_post_code  CODEid                   1       3893 GB  38932       5091 BE  50913       1087 MB  10874       7905 GW  79055       5121 ZH  5121
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python