如何检查熊猫数据框行在各个列中是不是具有某些值,可扩展性

Posted

技术标签:

【中文标题】如何检查熊猫数据框行在各个列中是不是具有某些值,可扩展性【英文标题】:How to check if pandas dataframe rows have certain values in various columns, scalability如何检查熊猫数据框行在各个列中是否具有某些值,可扩展性 【发布时间】:2018-04-10 13:09:30 【问题描述】:

我实现了CN2分类算法,它归纳出规则对表格的数据进行分类:

IF Attribute1 = a AND Attribute4 = b THEN class= 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。具体来说,在我展示的示例中,我希望结果是第一行的索引,这是唯一满足规则的行。

【问题讨论】:

还要在问题中添加预期输出?可能在寻找df[df.isin(rule).all(axis=1)]df.index[df.isin(rule).all(1)] 您是否需要df.isin(rule).any(axis=1) 来检查每行是否至少有一个值是Truedf.isin(rule).all(axis=1) 来检查所有值是否为真? 【参考方案1】:

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

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

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

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

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

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

对于过滤是可能的使用boolean indexing:

df = df[mask]

【讨论】:

以上是关于如何检查熊猫数据框行在各个列中是不是具有某些值,可扩展性的主要内容,如果未能解决你的问题,请参考以下文章

如何获取熊猫数据框中的行,列中具有最大值并保留原始索引?

熊猫:检查是不是存在具有某些值的行

R - 检查 r 数据框行的任何列中是不是存在 NA,如果存在,则删除该行 [重复]

熊猫过滤具有特定年份的数据框行

根据两列的值选择熊猫数据框行

从具有最低值的熊猫列中选择值