关于Pandas版本: 本文基于 pandas2.1.2 编写。
关于本文内容更新: 随着pandas的stable版本更迭,本文持续更新,不断完善补充。
Pandas稳定版更新及变动内容整合专题: Pandas稳定版更新及变动迭持续更新。
Pandas API参考所有内容目录
本节目录
- Pandas.DataFrame.drop()
- 语法:
- 返回值:
- 参数说明:
- labels 指定要删除行或列
- axis 指定删除方向(行或列)
- index & columns 定向删除行或列
- level 指定多层索引层级
- inplace 原地生效(是否在原始数据里直接修改)
- errors 原地生效(是否在原始数据里直接修改)
- Raises:
- 相关方法:
- 示例:
- 例1:删除单个或多个行、列,`labels` 参数的传参方法
- 例2:使用 `index` `columns` 参数,可以实现同时对行和列进行删除:
- 例3:使用 `level`参数,可以实现同时删除多个目标
Pandas.DataFrame.drop()
Pandas.DataFrame.drop
用于删除行或列。
- 使用列名(labels)删除列;
- 使用行索引(index) 删除行。
语法:
DataFrame.drop(labels=None, *, axis=0, index=None, columns=None, level=None, inplace=False, errors=‘raise’)
返回值:
-
DataFrame or None
返回值是一个新的
DataFrame
,其中删除了指定的行或列,或者如果inplace=True
则返回None
。
参数说明:
labels 指定要删除行或列
-
labels : *single label or list-like 例1
labels
参数用于指定要删除的列,或要删除的行:- single label: 删除单行或列,就使用单个列名或索引; 例1-2
- list-like: 删除多行或多列,就使用类似列表,传递多个行索引或列名构成的类似列表。例1-3
⚠️ 注意 :
元组(tuble) 不再被理解为
list-like
,因为它有特殊用途,多层索引,需要用元组传递行索引或列名!例1-4
axis 指定删除方向(行或列)
-
axis : {0 or ‘index’, 1 or ‘columns’}, default 0
axis
参数用于指定删除行,或是删除列:- 0 或 ‘index’ : 删除行;
- 1 or ‘columns’: 删除列。
index & columns 定向删除行或列
-
index : single label or list-like
-
columns : single label or list-like
index
参数,用于指定要删除的行。 (index=labels
等效于labels
,axis=0
)。columns
参数,用于指定要删除的列。(columns=labels
等效于labels
,axis=1
)。index
参数和columns
参数主要用于同时删除行、列的情况。例2- single label: 删除单行或列,就使用单个列名或索引;
- list-like: 删除多行或多列,就使用类似列表,传递多个行索引或列名构成的类似列表。
⚠️ 注意 :
元组(tuble) 不再被理解为
list-like
,因为它有特殊用途,多层索引,需要用元组传递行索引或列名!index
参数columns
参数 二者均不能和axis
参数混用
level 指定多层索引层级
-
level : int or level name, optional
level
参数用于指定多层索引的层级。例3- int: 层级的整数编号;
- level name: 层级名称。
⚠️ 注意 :
这个参数,旨在弥补当有多层索引时
labels
参数传递元组会很麻烦尴尬。例3-1如果指定的层级里,
labels
参数指定的列名或索引出现了多次,所有匹配的都会被删除。
inplace 原地生效(是否在原始数据里直接修改)
-
inplace : bool, default False
inplace
参数用于指定是否在原数据里直接删除行或列,默认inplace=False
:- True : 在原数据里直接修改,并返回
None
; - False: 创建一个数据副本,并在此副本里删除行或列,不会影响原数据。
- True : 在原数据里直接修改,并返回
errors 原地生效(是否在原始数据里直接修改)
-
errors : {‘ignore’, ‘raise’}, default ‘raise’
errors
参数用于控制当发生错误时,是否报告错误内容,默认errors= ‘raise’
表示会中止当前操作并报告错误内容。:- ‘ignore’: 忽略,不报告错误;
- ‘raise’: 停止操作,并报告错误内容。
Raises:
如果没有找到你传递的行索引、列名,会停中止当前操作,并引发 KeyError
。
相关方法:
➡️ 相关方法
DataFrame.loc
筛选数据-标签法
DataFrame.dropna
Return DataFrame with labels on given axis omitted where (all or any) data are missing.
DataFrame.drop_duplicates
Return DataFrame with duplicate rows removed, optionally only considering certain columns.
Series.drop
Return Series with specified index labels removed.
示例:
测试文件下载:
本文所涉及的测试文件,如有需要,可在文章顶部的绑定资源处下载。
若发现文件无法下载,应该是资源包有内容更新,正在审核,请稍后再试。或站内私信作者索要。
例1:删除单个或多个行、列,labels
参数的传参方法
- 例1-1、构建演示数据,并观察
import pandas as pd
# 构建演示数据
idx = pd.Index(["一", "二", "三"], name="行索引 ↓")
idx_labels = pd.Index(["A", "B", "C"], name="列名 →")
data = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
df = pd.DataFrame(data, index=idx, columns=idx_labels)
# 观察演示数据
df
列名 → | A | B | C |
---|---|---|---|
行索引 ↓ | |||
一 | 1 | 2 | 3 |
二 | 4 | 5 | 6 |
三 | 7 | 8 | 9 |
- 例1-2、删除单个行、列
删除单个行,就指定单个行索引,删除单个列,就指定单个列名。注意,axis
参数会影响删除方向,默认 axis=0
表示删除行:
# 删除单个行
df.drop("一")
# ... 列名 → A B C
# ... 行索引 ↓
# ... 二 4 5 6
# ... 三 7 8 9
# 删除单个列,注意修改axis参数
df.drop("A", axis=1)
# ... 列名 → B C
# ... 行索引 ↓
# ... 一 2 3
# ... 二 5 6
# ... 三 8 9
- 例1-3、删除多个行、多个列,可以用类似列表传递多个行索引、或多个列名。
# 删除多个行
df.drop(["一", "二"])
# ... 列名 → A B C
# ... 行索引 ↓
# ... 三 7 8 9
# 删除多个列
# df.drop(["A", "B"], axis=1)
# ... 列名 → C
# ... 行索引 ↓
# ... 一 3
# ... 二 6
# ... 三 9
- 例1-4、多层索引删除行、列,需要传递从最顶层到最底层索引 的 行索引或列名 构成的 元组:
先构建一个多层索引的 DataFrame
:
midx = pd.MultiIndex(
levels=[["llama", "cow", "falcon"], ["speed", "weight", "length"]],
codes=[[0, 0, 0, 1, 1, 1, 2, 2, 2], [0, 1, 2, 0, 1, 2, 0, 1, 2]],
)
df = pd.DataFrame(
index=midx,
columns=["big", "small"],
data=[
[45, 30],
[200, 100],
[1.5, 1],
[30, 20],
[250, 150],
[1.5, 0.8],
[320, 250],
[1, 0.8],
[0.3, 0.2],
],
)
df
big | small | ||
---|---|---|---|
llama | speed | 45.0 | 30.0 |
weight | 200.0 | 100.0 | |
length | 1.5 | 1.0 | |
cow | speed | 30.0 | 20.0 |
weight | 250.0 | 150.0 | |
length | 1.5 | 0.8 | |
falcon | speed | 320.0 | 250.0 |
weight | 1.0 | 0.8 | |
length | 0.3 | 0.2 |
以删除 llama speed
这一行为例:
df.drop(("llama", "speed"))
big | small | ||
---|---|---|---|
llama | weight | 200.0 | 100.0 |
length | 1.5 | 1.0 | |
cow | speed | 30.0 | 20.0 |
weight | 250.0 | 150.0 | |
length | 1.5 | 0.8 | |
falcon | speed | 320.0 | 250.0 |
weight | 1.0 | 0.8 | |
length | 0.3 | 0.2 |
import pandas as pd
# 构建演示数据
idx = pd.Index(["一", "二", "三"], name="行索引 ↓")
idx_labels = pd.Index(["A", "B", "C"], name="列名 →")
data = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
df = pd.DataFrame(data, index=idx, columns=idx_labels)
# 观察演示数据
df.drop(index="一", axis=1)
列名 → | A | B | C |
---|---|---|---|
行索引 ↓ | |||
二 | 4 | 5 | 6 |
三 | 7 | 8 | 9 |
例2:使用 index
columns
参数,可以实现同时对行和列进行删除:
import pandas as pd
# 构建演示数据
idx = pd.Index(["一", "二", "三"], name="行索引 ↓")
idx_labels = pd.Index(["A", "B", "C"], name="列名 →")
data = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
df = pd.DataFrame(data, index=idx, columns=idx_labels)
# 同时删除 行二,B列和C列
df.drop(index="二", columns=["B", "C"])
列名 → | A |
---|---|
行索引 ↓ | |
一 | 1 |
三 | 7 |
例3:使用 level
参数,可以实现同时删除多个目标
- 例3-1、构建演示数据
import numpy as np
import pandas as pd
# 创建示例数据
data = np.random.randn(4, 4)
rows = pd.MultiIndex.from_product(
[["A", "B"], ["X", "Y"]], names=["0 层行索引(顶层)", "1 层行索引(底层)"]
)
columns1 = pd.MultiIndex.from_tuples(
[
("0-1", "1-1", "2-1"),
("0-2", "1-2", "2-2"),
("0-3", "1-2", "2-3"),
("0-4", "1-4", "2-4"),
],
names=["0 层列名(顶层)", "1 层列名", "2 层列名(底层)"],
)
# 创建 DataFrame
df = pd.DataFrame(data, index=rows, columns=columns1)
# 打印 DataFrame
df
0 层列名(顶层) | 0-1 | 0-2 | 0-3 | 0-4 | |
---|---|---|---|---|---|
1 层列名 | 1-1 | 1-2 | 1-2 | 1-4 | |
2 层列名(底层) | 2-1 | 2-2 | 2-3 | 2-4 | |
0 层行索引(顶层) | 1 层行索引(底层) | ||||
A | X | -0.612242 | -1.386309 | 1.200706 | -0.435893 |
Y | 2.912622 | -0.444368 | 0.340908 | 1.159878 | |
B | X | 0.553297 | -0.003906 | -0.944363 | -0.515691 |
Y | 0.482624 | -0.488962 | -0.112784 | -0.366956 |
- 例3-2、删除索引为X的如果使用元组传递给
labels
或index
参数,都会很麻烦,例如我要删除 1层 索引所有是 X 的行:
df.drop(index=[("A", "X"), ("B", "X")]) # 等效于df.drop(labels=[('A','X'),('B','X')], axis=0)
0 层列名(顶层) | 0-1 | 0-2 | 0-3 | 0-4 | |
---|---|---|---|---|---|
1 层列名 | 1-1 | 1-2 | 1-2 | 1-4 | |
2 层列名(底层) | 2-1 | 2-2 | 2-3 | 2-4 | |
0 层行索引(顶层) | 1 层行索引(底层) | ||||
A | Y | 2.912622 | -0.444368 | 0.340908 | 1.159878 |
B | Y | 0.482624 | -0.488962 | -0.112784 | -0.366956 |
- 例3-3、使用
level
参数,可以实现同时删除 1层 索引所有是 X 的行,就很方便:
df.drop(index='X',level=1)
0 层列名(顶层) | 0-1 | 0-2 | 0-3 | 0-4 | |
---|---|---|---|---|---|
1 层列名 | 1-1 | 1-2 | 1-2 | 1-4 | |
2 层列名(底层) | 2-1 | 2-2 | 2-3 | 2-4 | |
0 层行索引(顶层) | 1 层行索引(底层) | ||||
A | Y | 2.912622 | -0.444368 | 0.340908 | 1.159878 |
B | Y | 0.482624 | -0.488962 | -0.112784 | -0.366956 |