23

My df has 3 columns

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")}) 

I want to drop rows where df.col_1 is 1.0 and df.col_2 is 0.0. So, I would get:

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

I tried:

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

It gives me the error:

'method' object is not subscriptable

Any idea how to solve the above problem?

Saurabh
  • 6,863
  • 4
  • 43
  • 42
Dsh M
  • 301
  • 1
  • 3
  • 12

5 Answers5

38

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) an 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
Dani Mesejo
  • 55,057
  • 6
  • 42
  • 65
15

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)),:]
Charles R
  • 1,501
  • 1
  • 7
  • 24
7

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))]
Saurabh
  • 6,863
  • 4
  • 43
  • 42
  • The "|" operator is for "OR", while the "&" operator is for "AND" conditions. I think what is needed here is the & operator – Web Ster Aug 04 '21 at 13:59
6
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().

zr0gravity7
  • 2,308
  • 1
  • 6
  • 22
Alex Slessor
  • 61
  • 1
  • 4
1

Put the location of row which you want remove at "location".

df = df.drop(['location' axix=1, inplace=True]
xandermonkey
  • 3,272
  • 2
  • 24
  • 46