关于Pandas版本: 本文基于 pandas2.1.2 编写。
关于本文内容更新: 随着pandas的stable版本更迭,本文持续更新,不断完善补充。
Pandas稳定版更新及变动内容整合专题: Pandas稳定版更新及变动迭持续更新。
Pandas.DataFrame.drop
用于删除行或列。
DataFrame.drop(labels=None, *, axis=0, index=None, columns=None, level=None, inplace=False, errors=‘raise’)
DataFrame or None
返回值是一个新的 DataFrame
,其中删除了指定的行或列,或者如果 inplace=True
则返回 None
。
labels : *single label or list-like 例1
labels
参数用于指定要删除的列,或要删除的行:
?? 注意 :
元组(tuble) 不再被理解为
list-like
,因为它有特殊用途,多层索引,需要用元组传递行索引或列名!例1-4
axis : {0 or ‘index’, 1 or ‘columns’}, default 0
axis
参数用于指定删除行,或是删除列:
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
?? 注意 :
元组(tuble) 不再被理解为
list-like
,因为它有特殊用途,多层索引,需要用元组传递行索引或列名!
index
参数columns
参数 二者均不能和axis
参数混用
level : int or level name, optional
level
参数用于指定多层索引的层级。例3
?? 注意 :
这个参数,旨在弥补当有多层索引时
labels
参数传递元组会很麻烦尴尬。例3-1如果指定的层级里,
labels
参数指定的列名或索引出现了多次,所有匹配的都会被删除。
inplace : bool, default False
inplace
参数用于指定是否在原数据里直接删除行或列,默认 inplace=False
:
None
;errors : {‘ignore’, ‘raise’}, default ‘raise’
errors
参数用于控制当发生错误时,是否报告错误内容,默认 errors= ‘raise’
表示会中止当前操作并报告错误内容。:
如果没有找到你传递的行索引、列名,会停中止当前操作,并引发 KeyError
。
?? 相关方法
筛选数据-标签法
Return DataFrame with labels on given axis omitted where (all or any) data are missing.
Return DataFrame with duplicate rows removed, optionally only considering certain columns.
Return Series with specified index labels removed.
测试文件下载:
本文所涉及的测试文件,如有需要,可在文章顶部的绑定资源处下载。
若发现文件无法下载,应该是资源包有内容更新,正在审核,请稍后再试。或站内私信作者索要。
labels
参数的传参方法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 |
删除单个行,就指定单个行索引,删除单个列,就指定单个列名。注意,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
# 删除多个行
df.drop(["一", "二"])
# ... 列名 → A B C
# ... 行索引 ↓
# ... 三 7 8 9
# 删除多个列
# df.drop(["A", "B"], axis=1)
# ... 列名 → C
# ... 行索引 ↓
# ... 一 3
# ... 二 6
# ... 三 9
先构建一个多层索引的 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 |
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 |
level
参数,可以实现同时删除多个目标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 |
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 |
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 |