Pandas OR语句以系列结尾包含

时间:2013-11-19 03:38:14

标签: python pandas

我有一个DataFrame df,其列typesubtype以及大约100k行,我试图对df包含的数据类型进行分类检查type / subtype组合。虽然df可以包含许多不同的组合,但只有特定的组合才会出现在某些数据类型中。要检查我的对象是否包含我目前正在执行的任何组合:

typeA = ((df.type == 0) & ((df.subtype == 2) | (df.subtype == 3) | 
         (df.subtype == 5) | (df.subtype == 6))) | 
         ((df.type == 5) & ((df.subtype == 3) | (df.subtype == 4) | (df.subtype == 7) | 
         (df.subtype ==  8)))
A = typeA.sum()

如果A类型是长期的Falses系列,那么可能有一些真则。 0然后我知道它包含一个True。这个方案的问题是,如果df的第一行产生一个True,它仍然需要检查其他所有内容。检查整个DataFrame比使用带有中断的for循环更快,但我想知道是否有更好的方法。

感谢您的任何建议。

2 个答案:

答案 0 :(得分:6)

使用crosstab

import numpy as np
import pandas as pd
df = pd.DataFrame(np.random.randint(0, 10, size=(100, 2)), columns=["type", "subtype"])
counts = pd.crosstab(df.type, df.subtype)

print counts.loc[0, [2, 3, 5, 6]].sum() + counts.loc[5, [3, 4, 7, 8]].sum()

结果与:

相同
a = (((df.type == 0) & ((df.subtype == 2) | (df.subtype == 3) | 
         (df.subtype == 5) | (df.subtype == 6))) | 
         ((df.type == 5) & ((df.subtype == 3) | (df.subtype == 4) | (df.subtype == 7) | 
         (df.subtype ==  8))))
a.sum()

答案 1 :(得分:1)

在pandas 0.13(即将发布)中,您可以将其作为query传递,它将使用numexpr,这对您的用例应该更有效:

df.query("((df.type == 0) & ((df.subtype == 2) | (df.subtype == 3) | 
         (df.subtype == 5) | (df.subtype == 6))) | 
         ((df.type == 5) & ((df.subtype == 3) | (df.subtype == 4) | (df.subtype == 7) | 
         (df.subtype ==  8)))")

注意:我可能会清理缩进以使其更具可读性(在大多数情况下,您也可以用类型替换df.type:

df.query("((type == 0) & ((subtype == 2)"
                        "|(subtype == 3)"
                        "|(subtype == 5)"
                        "|(subtype == 6)))"
        "|((type == 5) & ((subtype == 3)"
                        "|(subtype == 4)"
                        "|(subtype == 7)"
                        "|(subtype ==  8)))")

更新:使用“in”语法可能更有效,更简洁,更简洁:

df.query("(type == 0) & (subtype in [2, 3, 5, 6])"
        "|(type == 5) & (subtype in [3, 4, 7, 8])")