Pandas OR statement ending in series contains
pandas, python
Solution
use Pandas `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()
the result is same as:
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()
Problem
I have a DataFrame `df` that has columns `type` and `subtype` and about 100k rows, I'm trying to classify what kind of data `df` contains by checking `type` / `subtype` combinations. While `df` can contain many different combinations there are particular combinations that only appear in certain data types. To check if my objects contains any of these combinations I'm currently doing: ``` 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() ``` Where typeA is a long Series of Falses that might have some Trues, if A > 0 then I know it contained a True. The problem with this scheme is that if the first row of the df produces a True it still has to check everything else. Checking the whole DataFrame is faster then using a for loop with a break, but I'm wondering if there is a better way to do it. Thanks for any suggestions.