【发布时间】:2020-11-09 00:58:57
【问题描述】:
我有两个数据框。一个具有产品 ID 信息,另一个是具有区域映射和映射 ID 的主数据框。
# this is dummy dataframe for example
product_df= pd.DataFrame([['abc','+1235']['cshdgs','+1352648'],['gdsfsn','+1232455']],columns='['roll','prod_id'])
master_df=pd.DataFrame([['AZ','32'],['WW','123'],['RT','12'],['PO','13'],['SZ','1352']], columns=['Zone','match_id']
我想在 product_df 记录旁边获取区域信息。其逻辑是(inSQL):
select product_df.* left join master_df.Zone where '+'||match_id=substr(prod_id,1,2) or '+'||match_id=substr(prod_id,1,3) or '+'||match_id=substr(prod_id,1,4) or '+'||match_id=substr(prod_id,1,5)
基本上这将是条件合并。 我知道,由于这种加入逻辑,多个区域可能会映射到同一个卷。但这就是问题所在。
我正在尝试在 Python 中实现相同的功能。我正在使用以下代码:
master_df_dict=master_df.sert_index('match_id')['Zone'].to_dict
keys_list=['+' + key for key in master_df_dict.keys()]
def zone(pr_id):
if pr_id[0:2] in keys_list:
C=keys_list[pr_id[1:2]] # basically getting the zone information using the matched key, and as
#first character is always plus, starting the index at 1
elif pr_id[0:3] in keys_list:
C=keys_list[pr_id[1:3]]
elif pr_id[0:4] in keys_list:
C=keys_list[pr_id[1:4]]
elif pr_id[0:5] in keys_list:
C=keys_list[pr_id[1:5]]
else:
C=''
return C
product_df['Zone_info']=product_df['prod_id].apply(zone)
这种方法有两个问题:
-
它只会给我第一个匹配的代码,即使后面的条件也匹配,它会在匹配到一个条件时立即退出循环。
-
使用这种方法,我需要大约 45 分钟来解析 1700 条记录。
我需要以下方面的帮助:
-
为什么上面的代码需要这么长时间才能工作?我怎样才能让它运行得更快
-
对于上面提到的基于多个条件加入的 sql 逻辑,我可以得到精确的 python 执行吗?据我搜索,python 没有像 sql 那样在条件下合并的功能。我们能有一个解决方法吗?
-
如果没有办法合并所有的 or 条件,有没有办法合并至少第一个匹配条件并使其运行得更快?
请帮忙!!
【问题讨论】:
标签: python pandas merge conditional-statements