staten12
staten12

Reputation: 785

How do I create a "not" filter in pandas

I have this large dataframe I've imported into pandas and I want to chop it down via a filter. Here is my basic sample code:

import pandas as pd
import numpy as np
from pandas import Series, DataFrame

df = DataFrame({'A':[12345,0,3005,0,0,16455,16454,10694,3005],'B':[0,0,0,1,2,4,3,5,6]})

df2= df[df["A"].map(lambda x: x > 0) & (df["B"] > 0)]

Basically this displays bottom 4 results which is semi-correct. But I need to display everything BUT these results. So essentially, I'm looking for a way to use this filter but in a "not" version if that's possible. So if column A is greater than 0 AND column B is greater than 0 then we want to disqualify these values from the dataframe. Thanks

Upvotes: 25

Views: 36117

Answers (4)

abhay patil
abhay patil

Reputation: 89

you could use: wrap everything in a bracket and use a ~ (tilde) outside. in place of not.

df[~((df['A'] >0) & (df['B']>0))]

answer:

    A       B
0   12345   0
1   0       0
2   3005    0
3   0       1
4   0       2

Upvotes: 2

hhbilly
hhbilly

Reputation: 1305

No need for map function call on Series "A".

Apply De Morgan's Law:

"not (A and B)" is the same as "(not A) or (not B)"

df2 = df[~(df.A > 0) | ~(df.B > 0)]

Upvotes: 47

ssm
ssm

Reputation: 5383

There is no need for the map implementation. You can just reverse the arguments like ...

df.ix[(df.A<=0)|(df.B<=0),:]

Or use boolean indexing without ix:

df[(df.A<=0)|(df.B<=0)]

Upvotes: 1

piRSquared
piRSquared

Reputation: 294488

Try

df2 = df[df["A"].map(lambda x: x <= 0) | (df["B"] <= 0)]

Upvotes: 0

Related Questions