Remove Pandas rows and columns using drop(), labels, index, axis and MultiIndex levels. Practise conditional cleaning and keep review records.
Show Table of Contents ↓import pandas as pd
df = pd.DataFrame({"NAME": ["Ravi", "Raju", "Alex", "Ron", "King", "Jack"],
"ID": [1, 2, 3, 4, 5, 6], "MATH": [80, 40, 70, 70, 70, 30],
"ENGLISH": [80, 70, 40, 50, 60, 30]})
print(df)
assert df.shape == (6, 4)Expected output
NAME ID MATH ENGLISH
0 Ravi 1 80 80
1 Raju 2 40 70
2 Alex 3 70 40
3 Ron 4 70 50
4 King 5 70 60
5 Jack 6 30 30df.drop(columns="ID")
assert "ID" in df.columns
trimmed = df.drop(columns="ID")
print(trimmed)
assert trimmed.columns.tolist() == ["NAME", "MATH", "ENGLISH"]
assert "ID" in df.columnsExpected output
NAME MATH ENGLISH
0 Ravi 80 80
1 Raju 40 70
2 Alex 70 40
3 Ron 70 50
4 King 70 60
5 Jack 30 30working = df.copy()
result = working.drop(columns="ID", inplace=True)
print(working)
assert result is None and "ID" not in working.columns
assert "ID" in df.columnsExpected output
NAME MATH ENGLISH
0 Ravi 80 80
1 Raju 40 70
2 Alex 70 40
3 Ron 70 50
4 King 70 60
5 Jack 30 30remaining = df.drop(labels=[2, 4])
print(remaining)
assert remaining.index.tolist() == [0, 1, 3, 5]Expected output
NAME ID MATH ENGLISH
0 Ravi 1 80 80
1 Raju 2 40 70
3 Ron 4 70 50
5 Jack 6 30 30first = df.drop(columns=["ID", "MATH"])
second = df.drop(labels=["ID", "MATH"], axis=1)
pd.testing.assert_frame_equal(first, second)
print(first)
assert first.columns.tolist() == ["NAME", "ENGLISH"]Expected output
NAME ENGLISH
0 Ravi 80
1 Raju 70
2 Alex 40
3 Ron 50
4 King 60
5 Jack 30result = df.drop(index=2, columns="MATH")
print(result)
assert 2 not in result.index and "MATH" not in result.columns
pd.testing.assert_frame_equal(df.drop(index=2, axis=0), df.drop(labels=2))Expected output
NAME ID ENGLISH
0 Ravi 1 80
1 Raju 2 70
3 Ron 4 50
4 King 5 60
5 Jack 6 30try:
df.drop(index=[1, 3, 7])
except KeyError:
print("Missing index label 7 raised KeyError")
else:
raise AssertionError("Expected missing-label error")
result = df.drop(index=[1, 3, 7], errors="ignore")
print(result)
assert result.index.tolist() == [0, 2, 4, 5]Expected output
Missing index label 7 raised KeyError
NAME ID MATH ENGLISH
0 Ravi 1 80 80
2 Alex 3 70 40
4 King 5 70 60
5 Jack 6 30 30labeled = df.copy()
labeled.index = [10, 20, 30, 40, 50, 60]
result = labeled.drop(index=labeled.index[[1, 3, 5]])
print(result)
assert result.index.tolist() == [10, 30, 50]
duplicate = df.head(3).copy()
duplicate.index = ["same", "same", "other"]
assert len(duplicate.drop(index="same")) == 1
assert len(duplicate.iloc[1:]) == 2Expected output
NAME ID MATH ENGLISH
10 Ravi 1 80 80
30 Alex 3 70 40
50 King 5 70 60remove = df.loc[df["ID"].eq(2)].index
result = df.drop(index=remove)
print(result)
assert result["ID"].tolist() == [1, 3, 4, 5, 6]
without_ravi = df.loc[~df["NAME"].eq("Ravi")].copy()
assert "Ravi" not in without_ravi["NAME"].tolist()Expected output
NAME ID MATH ENGLISH
0 Ravi 1 80 80
2 Alex 3 70 40
3 Ron 4 70 50
4 King 5 70 60
5 Jack 6 30 30both = df["NAME"].eq("Ravi") & df["ID"].eq(1)
either = df["NAME"].eq("Ravi") | df["ID"].eq(2)
and_result = df.drop(index=df.index[both])
or_result = df.drop(index=df.index[either])
print("AND remaining IDs:", and_result["ID"].tolist())
print("OR remaining IDs:", or_result["ID"].tolist())
assert len(and_result) == 5 and len(or_result) == 4Expected output
AND remaining IDs: [2, 3, 4, 5, 6]
OR remaining IDs: [3, 4, 5, 6]passing = df.loc[df["MATH"].ge(45)].copy()
one_student = df.loc[df["ID"].eq(3)].copy()
print(passing)
print(one_student)
assert passing["ID"].tolist() == [1, 3, 4, 5]
assert one_student["NAME"].tolist() == ["Alex"]Expected output
NAME ID MATH ENGLISH
0 Ravi 1 80 80
2 Alex 3 70 40
3 Ron 4 70 50
4 King 5 70 60
NAME ID MATH ENGLISH
2 Alex 3 70 40pages = pd.DataFrame({"Linking page": ["a" * 256, "b" * 257, None],
"Page": ["abc", "abcd", "x" * 12]})
too_long = pages["Linking page"].str.len().gt(256).fillna(False)
bad_page_length = pages["Page"].str.len().gt(3) & pages["Page"].str.len().lt(12)
links_kept = pages.drop(index=pages.index[too_long])
pages_kept = pages.drop(index=pages.index[bad_page_length])
print("Long-link removal kept labels:", links_kept.index.tolist())
print("Page-length removal kept labels:", pages_kept.index.tolist())
assert links_kept.index.tolist() == pages_kept.index.tolist() == [0, 2]Expected output
Long-link removal kept labels: [0, 2]
Page-length removal kept labels: [0, 2]empty = df.drop(index=df.index)
print(empty)
assert empty.shape == (0, 4)
assert empty.dtypes.equals(df.dtypes)Expected output
Empty DataFrame
Columns: [NAME, ID, MATH, ENGLISH]
Index: []by_labels = df.drop(index=df.tail(2).index)
by_positions = df.iloc[:-2].copy()
pd.testing.assert_frame_equal(by_labels, by_positions)
print(by_positions)
assert by_positions["ID"].tolist() == [1, 2, 3, 4]Expected output
NAME ID MATH ENGLISH
0 Ravi 1 80 80
1 Raju 2 40 70
2 Alex 3 70 40
3 Ron 4 70 50multi = df.head(4).copy()
multi.index = pd.MultiIndex.from_tuples([("North", 1), ("North", 2), ("South", 3), ("South", 4)],
names=["region", "student"])
regional = multi.drop(index="North", level="region")
one_removed = multi.drop(index=("North", 1))
print(regional)
assert len(regional) == 2 and len(one_removed) == 3Expected output
NAME ID MATH ENGLISH
region student
South 3 Alex 3 70 40
4 Ron 4 70 50sales = pd.DataFrame({"id": ["001", "002", "003"], "amount": [5.25, -1, None],
"review_note": ["", "negative", "missing"]})
valid = sales["amount"].notna() & sales["amount"].ge(0)
review = sales.loc[~valid].copy()
accepted = sales.loc[valid].drop(columns="review_note")
print(accepted)
print("Review IDs:", review["id"].tolist())
assert accepted["amount"].sum() == 5.25
assert len(accepted) + len(review) == len(sales)Expected output
id amount
0 001 5.25
Review IDs: ['002', '003']| Parameter | Meaning |
|---|---|
labels / axis | Match labels on rows (0) or columns (1). |
index / columns | Explicit row-label / column-label selection. |
level | Named or numbered MultiIndex level. |
inplace | False returns a DataFrame; True mutates and returns None. |
errors | raise by default; ignore skips absent labels. |
drop() removes labels. dropna() removes missing-value records; drop_duplicates() handles repeated records. Do not confuse row positions, index labels and ID column values. Reset independent examples before trying another deletion. Check duplicate labels before using a mask's index to drop rows. Prefer explicit reassignment when retaining a clear original/cleaned pair.
remove = df.index[df["MATH"].lt(45)]
answer = df.drop(index=remove, columns="ID")
print(answer)
assert answer["NAME"].tolist() == ["Ravi", "Alex", "Ron", "King"]
assert df.shape == (6, 4) and "ID" in df.columnsExpected output
NAME MATH ENGLISH
0 Ravi 80 80
2 Alex 70 40
3 Ron 70 50
4 King 70 60Open in Google Colab View on GitHub
Run examples in order, inspect database records and try the exercise. Save a copy to keep edits.
Reference: Pandas drop() documentation.
Author & Instructor at plus2net
I write and maintain practical tutorials on Python, PHP, SQL, JavaScript, HTML, jQuery, and web development at plus2net. The tutorials focus on clear explanations, working examples, and code that readers can test and adapt while learning.