[英]Match pandas column values of 2 dataframes
设定
我有2个熊猫数据框:
df_ads
:每行包含一个df_ads['ad_post_code']
房屋广告的信息, df_ads['ad_post_code']
包含广告的荷兰邮政编码。 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) = 4074
, df_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) = 85353
而len(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.