我有一个用例,我需要验证df中的每一行并标记它是否正确。验证规则在另一个df。
Main
col1 col2
0 1 take me home
1 2 country roads
2 2 country roads take
3 4 me home
Rules
col3 col4
0 1 take
1 2 home
2 3 country
3 4 om
4 2 take
如果以下条件与main
rules
中的行会被标记为通过
传球的条件是: col1 == col3和col4是col2的子串
Main
col1 col2 result
0 1 take me home Pass
1 2 country roads Fail
2 2 country roads take Pass
3 4 me home Pass
我最初的方法是解析规则df并动态创建一个函数,然后运行
def action_function(row) -> object:
if self.combined_filter()(row): #combined_filter() is the lambda equivalent of Rules df
return success_action(row) #mark as pass
return fail_action(row) #mark as fail
Main["result"] = self.df.apply(action_function, axis=1)
由于应用不是矢量化,因此结果非常慢。主df约为300万,规则df约为500个条目。所需时间约为3小时。
我正在尝试使用pandas merge。但合并操作不支持子字符串匹配。我不能用空格或任何东西来分词。
这将用作系统的一部分。所以我不能硬编码。每次系统启动时我都需要从excel中读取df。 你能为此建议一个方法吗?
答案 0 :(得分:1)
合并,然后使用np.where即
应用条件temp = main.merge(rules,left_on='col1',right_on='col3')
temp['results'] = temp.apply(lambda x : np.where(x['col4'] in x['col2'],'Pass','Fail'),1)
no_dupe_df = temp.drop_duplicates('col2',keep='last').drop(['col3','col4'],1)
col1 col2 results
0 1 take me home Pass
2 2 country roads Fail
4 2 country roads take Pass
5 4 me home Pass