Python嵌套循环,如果不满足条件则中断

Python嵌套循环,如果不满足条件则中断,python,pandas,loops,break,Python,Pandas,Loops,Break,我一直在尝试使用一个嵌套循环来迭代数据帧(外部循环)的行,对于每一行,检查一个规则的条件,一个元组列表:[(属性,值),(Att,Val)],是否匹配数据帧(内部循环)行中的那些Att,Val对。如果规则中的所有条件都满足,我希望记录行的索引,如果一个或多个条件失败,我希望在不记录行索引的情况下中断内部循环并继续到下一行 我已经试着将break语句放在内部循环、外部循环等中,但我无法让它按我所希望的那样工作。非常感谢你试图帮助我 def rule_coverage(self, rule):

我一直在尝试使用一个嵌套循环来迭代数据帧(外部循环)的行,对于每一行,检查一个规则的条件,一个元组列表:[(属性,值),(Att,Val)],是否匹配数据帧(内部循环)行中的那些Att,Val对。如果规则中的所有条件都满足,我希望记录行的索引,如果一个或多个条件失败,我希望在不记录行索引的情况下中断内部循环并继续到下一行

我已经试着将break语句放在内部循环、外部循环等中,但我无法让它按我所希望的那样工作。非常感谢你试图帮助我

def rule_coverage(self, rule):

    for index,row in self.data.iterrows():  

        for selector in rule:

            if row[selector[0]]  != selector[1]:
                break

        coverage.append(index)

 return self.data.iloc[coverage]    

我会这样做:

s
成为表示
规则的
pandas.Series

s = pd.Series(dict(rule))
重新分配要与
s
s对齐的数据帧

d, s = self.data.align(s, 'inner', 1)
然后对整行进行比较并仅返回true

self.data[d.eq(s).all(1)]

同志们,我按照许多其他帖子的建议解决了这个问题,这些帖子建议将内部循环重构为一个函数,将期望的结果返回给外部循环。谢谢你给我的建议。解决方案如下,上层函数是以前的内环,下层函数是现在简化的外环

def check_rule_datapoint(self, datapoint, complex):
    """
    Function to check if a given data point satisfies
    the conditions of a given complex. Data point 
    should be a pandas Series. Complex should be a
    tuple or a list of tuples where each tuple is of
    the form ('Attribute', 'Value').
    """
    if type(complex) == tuple:
        if datapoint[complex[0]] == complex[1]:
            return True
        else:
            return False

    if type(complex) == list:
        result = True   
        for selector in complex:
            if datapoint[selector[0]] != selector[1]:
                result = False

        return result       

def complex_coverage(self, complex):
    """ Returns set of instances of the data 
        which complex(rule) covers.
    """

    #import ipdb;ipdb.set_trace(context=8)
    coverage = []

    #iterate over dataframe rows
    for index,row in self.data.iterrows():
        if self.check_rule_datapoint(row, complex):
            coverage.append(index)

    return self.data.iloc[coverage]

这是一种在数据帧上进行迭代的低效方法。显示您的数据,并解释您尝试执行的操作,我们可以为您提供一种矢量化方法,该方法应该比这快得多。我目前使用的是一个简单的数据集,每个数据集有5个属性和整数值,规则可能会测试单个或多个属性。我希望扩展代码以处理更复杂的数据、丢失的数据等,但我目前正试图从UCI获得一个关于lense数据集的工作版本。如果不同的规则测试了不同数量的属性,我还能使用矢量化操作吗?我要的是你的数据。。。不是一个解释。。。如果没有数据或预期的输出,我们无法理解您想要什么。第一列只是一个行索引,最后一列是类标签,中间的列是属性。太棒了,谢谢。您对该样本数据的预期输出是什么?这些规则可能测试给定数据点的任意数量的属性,每个规则可能测试不同数量的属性,您建议的方法能否满足这一点?@seanysull这是提供最小和完整可验证示例的要点。没有它,我无法确定你在说什么。