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