为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

湖上湖 2021-07-29 21:07:56
设置我有 2 个熊猫数据框:df_ads:每一行都包含一个已抓取的房屋广告的信息,并df_ads['ad_post_code']包含该广告的荷兰邮政编码。df_mapping:邮政编码和NUTS3区域之间的映射我需要将每个广告的邮政编码映射到其 NUTS3 区域。数据帧df_ads['ad_post_code'] 看起来像,0                1567 JA1                3893 GB2                5091 BE3                1087 MB4                7905 GW5                5121 ZH哪里len(df_ads['ad_post_code']) = 85447。df_mapping 看起来像,      CODE NUTS_30     1011  NL3261     1012  NL3262     1013  NL3263     1014  NL3264     1015  NL3265     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 listfor 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 循环,使其一切正常?
查看完整描述

1 回答

?
弑天下

TA贡献1818条经验 获得超8个赞

我将首先在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


查看完整回答
反对 回复 2021-08-03
  • 1 回答
  • 0 关注
  • 109 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信