Drop rows on multiple conditions in pandas dataframe

Try to filter your df with loc. It's so powerful! The "~" means you want to keep those with the opposite of your condition. The ":" means you want to keep all the columns

df = df.loc[~((df['col_1'] == 1.0) & (df['col_2'] == 0.0)),:]

drop is a method, you are calling it using [], that is why it gives you:

'method' object is not subscriptable

change to () (a normal method call) and it should work:

import pandas as pd

df = pd.DataFrame({"col_1": (0.0, 0.0, 1.0, 1.0, 0.0, 1.0, 1.0),
                   "col_2": (0.0, 0.24, 1.0, 0.0, 0.22, 3.11, 0.0),
                   "col_3": ("Mon", "Tue", "Thu", "Fri", "Mon", "Tue", "Thu")})

df_new = df.drop(df[(df['col_1'] == 1.0) & (df['col_2'] == 0.0)].index)
print(df_new)

Output

   col_1  col_2 col_3
0    0.0   0.00   Mon
1    0.0   0.24   Tue
2    1.0   1.00   Thu
4    0.0   0.22   Mon
5    1.0   3.11   Tue

mask = df['Product_Code'].isin(['filter1', 'filter2', 'filter3'])
df = df[~mask]
df.head()

.isin() allows you to filter the entire dataframe based on multiple values in a series. This is the least amount of code to write, compared to other solutions that I know of.

Adding the ~ inside the column wise filter reverses the logic of isin().


You can use or (|) operator for this , Refer this link for it pandas: multiple conditions while indexing data frame - unexpected behavior

i.e dropping rows where both conditions are met

 df = df.loc[~((df['col_1']==1) | (df['col_2']==0))]

Tags:

Python

Pandas