How to Use Pandas Drop Columns with an Integer Index: A Complete Guide

To drop a column by integer position in pandas, convert the position to a label using df.columns[pos] before passing it to df.drop(), as the drop() method expects column labels rather than positional indices.

When working with the pandas-dev/pandas repository, you’ll often need to remove specific columns from a DataFrame using their numerical position. While pandas drop columns operations are straightforward with label names, removing columns by integer index requires understanding how the underlying drop() method resolves its arguments.

Why Pandas Drop Columns Requires Labels, Not Positions

The DataFrame.drop method is implemented in pandas/core/generic.py as part of the shared NDFrame base class. When you call df.drop(labels, axis=1), the method forwards to NDFrame.drop at line 4566, which handles the generic logic for all pandas data structures.

The critical detail is that drop() performs label-based resolution, not positional indexing. When you pass an integer to drop(), pandas searches for a column whose actual label equals that integer value, not the column occupying that ordinal position. This behavior is defined in the label resolution logic within pandas/core/indexes/base.py around line 7112, where Index.drop removes specified labels from the axis.

How to Drop a Column by Integer Index in Pandas

To correctly use pandas drop columns with an integer position, you must first translate the position into its corresponding label using the .columns accessor.

Step 1: Convert Position to Label

Access the column label at your desired integer position:

col_label = df.columns[1]  # Gets the label of the second column

Step 2: Call Drop with the Label

Pass the retrieved label to drop() with axis=1:

df = df.drop(col_label, axis=1)

You can also chain these operations for concise code:

df = df.drop(df.columns[1], axis=1)

Dropping Multiple Columns by Integer Index

To remove several columns at specific positions, pass a list of positions to the columns indexer:

positions = [0, 2, 3]
cols_to_drop = df.columns[positions]
df = df.drop(cols_to_drop, axis=1)

This approach works because df.columns[positions] returns an Index object containing the labels at those positions, which drop() can then process correctly.

Under the Hood: How Pandas Drop Columns Works

The implementation spans three critical files in the pandas-dev/pandas repository:

  1. pandas/core/frame.py (lines 5917-5955): The concrete DataFrame class defines its specific drop method, which handles column-specific validation before delegating to the generic implementation.

  2. pandas/core/generic.py (lines 4566-4604): The NDFrame.drop method contains the core logic for axis determination and label resolution. This is where axis=1 is interpreted as "columns" and the method prepares the labels for removal.

  3. pandas/core/indexes/base.py (lines 7112-7125): The Index.drop method performs the actual label removal from the column index. It validates that the labels exist and constructs the new index excluding those labels.

Understanding this flow explains why integer positions must be converted to labels before reaching the Index.drop stage, as the index operations are strictly label-based.

Common Mistakes to Avoid

  • Passing integers directly: df.drop(0, axis=1) attempts to drop a column literally named 0, not the first column.
  • Confusing axis values: Remember that axis=1 refers to columns, while axis=0 refers to rows.
  • Modifying in-place unexpectedly: Unless using inplace=True, drop() returns a new DataFrame. Always assign the result back to your variable.

Summary

  • pandas drop columns operations require labels, not integer positions.
  • Convert positions to labels using df.columns[pos] before calling drop().
  • The drop() method is implemented in pandas/core/generic.py with label resolution handled in pandas/core/indexes/base.py.
  • For multiple columns, pass a list of positions to df.columns[] to retrieve all labels at once.

Frequently Asked Questions

Can I pass an integer directly to df.drop() to remove a column by position?

No. When you pass an integer to df.drop(), pandas searches for a column whose label equals that integer value, not the column at that ordinal position. To drop by position, you must first convert the integer to a label using df.columns[pos].

What happens if my column labels are themselves integers?

If your DataFrame has integer column labels (e.g., columns named 0, 1, 2), then passing an integer to drop() will match those labels. However, this is distinct from positional indexing. If you want the third column regardless of its name, you still need to use df.columns[2] to ensure you're accessing by position.

Is there a performance difference between dropping by label vs position?

No significant performance difference exists because dropping by position requires converting the position to a label first (via df.columns[pos]), which is an O(1) indexing operation. The actual drop() operation in pandas/core/indexes/base.py performs label-based filtering regardless of how you obtained the label.

How do I drop the last column using an integer index?

Use negative indexing to access the last position, then pass it to drop():

df = df.drop(df.columns[-1], axis=1)

This works because df.columns supports standard Python negative indexing, where -1 refers to the final element.

Have a question about this repo?

These articles cover the highlights, but your codebase questions are specific. Give your agent direct access to the source. Share this with your agent to get started:

Share the following with your agent to get started:
curl -s "https://instagit.com/install.md"

Works with
Claude Codex Cursor VS Code OpenClaw Any MCP Client

Maintain an open-source project? Get it listed too →