Python 用于过滤器的子字符串搜索
我有一个用例,我需要验证df中的每一行,并标记它是否正确。验证规则位于另一个df中Python 用于过滤器的子字符串搜索,python,pandas,dataframe,Python,Pandas,Dataframe,我有一个用例,我需要验证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 t
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
如果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)
由于apply没有矢量化,所以速度非常慢。主df约为300万条,规则df约为500条。所用时间约为3小时
我正在尝试使用熊猫合并。但合并操作不支持子字符串匹配。我不能用空格或任何东西来分割单词
这将作为系统的一部分使用。所以我不能硬编码任何东西。每次系统启动时,我都需要从excel中读取df。
你能建议一种方法吗?合并,然后使用np应用条件,其中,即
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
如果将
main
和rules
中的每一行与rules
中的对应行进行比较,那么main
中的一行如果与rules
中的任何行匹配,将通过。谢谢你指出这一点。编辑问题好吧,我几乎肯定没有简单的方法可以将每一行与500条规则进行比较,但是您可以通过将main
与每一条规则进行比较来对其进行矢量化。然后,你只需要迭代500个条目,而不是300万个条目,我不明白这将如何加速这个过程。它仍然是300万*500。你自己指出它没有矢量化。操作的缓慢部分是使用apply
遍历300万数据库中的每一行。这需要300万次迭代。如果我们将一条规则与整个数据库进行比较,那只需要1次迭代。