Python 用于过滤器的子字符串搜索

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

我有一个用例,我需要验证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
如果
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次迭代。