繁体   English   中英

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

[英]Match pandas column values of 2 dataframes

设定

我有2个熊猫数据框:

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

我需要将每个广告的邮政编码映射到其NUTS3区域。


Dataframes

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落在NUTS3区域NL326


问题

我做了一些简单的循环,将df_ads的广告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) = 85353len(df_ads) = 85448 ,这样df_ads['nuts3'] = nuts3会产生ValueError: Length of values does not match length of index

Double for循环是执行此操作的最快方法吗? 如果是这样,如何解决我的for循环,使其一切正常?

我将首先在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 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的列表是否完整,可以执行以下操作:

df_ads.loc [np.logical_not(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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM