如何检查pandas数据帧行是否在各列中具有某些值,可伸缩性

时间:2017-10-29 12:38:32

标签: python-3.x pandas classification vectorization

我已经实现了CN2分类算法,它引入了对表格数据进行分类的规则:

IF 属性1 = a AND 属性4 = b 那么类= 1级

我当前的实现使用iterrows()函数循环包含训练数据的pandas DataFrame,如果满足规则则返回每行的True或False,但是,我知道这是一个非常低效的解决方案。我想将代码矢量化,我目前的尝试是这样的:

DataFrame = df
    age  prescription  astigmatism  tear rate  
    1      1              2            1         
    2      2              1            1         
    2      1              1            2         

rule = {'age':[1],'prescription':[1],'astigmatism':[1,2],'tear rate':[1,2]}
df.isin(rule)

这会产生:

age  prescription  astigmatism  tear rate  
True   True             True       True  
False  False            True       True  
False  True             True       True  

我已将规则编码为字典,其中包含目标属性的单个值和非目标属性的所有可能值的集合。

如果满足规则的条件,那么我想要的结果是每行的单个True或False,以及评估为全部True的行的索引。目前我只能为每个值获得一个带T / F的DataFrame。具体来说,在我所示的例子中,我希望结果是第一行的索引,这是唯一满足规则的行。

1 个答案:

答案 0 :(得分:1)

我认为您需要检查每行至少有一个值是True使用DataFrame.any

mask = df.isin(rule).any(axis=1)

print (mask)
0    True
1    True
2    True
dtype: bool

或者检查所有值是否True使用DataFrame.all

mask = df.isin(rule).all(axis=1)

print (mask)
0     True
1    False
2    False
dtype: bool

对于过滤,可以使用boolean indexing

df = df[mask]