'Drop rows on multiple conditions in pandas dataframe
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?
Solution 1:[1]
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
Solution 2:[2]
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)),:]
Solution 3:[3]
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))]
Solution 4:[4]
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().
Solution 5:[5]
Put the location of row which you want remove at "location".
df = df.drop(['location' axix=1, inplace=True]
Sources
This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.
Source: Stack Overflow
| Solution | Source |
|---|---|
| Solution 1 | Dani Mesejo |
| Solution 2 | Mechi Fendel |
| Solution 3 | Saurabh |
| Solution 4 | zr0gravity7 |
| Solution 5 | xandermonkey |
