Pandas.DataFrame.drop() 删除行或列 详解 含代码 含测试数据集 随Pandas版本持续更新

发布时间:2024年01月18日

关于Pandas版本: 本文基于 pandas2.1.2 编写。

关于本文内容更新: 随着pandas的stable版本更迭,本文持续更新,不断完善补充。

Pandas稳定版更新及变动内容整合专题: Pandas稳定版更新及变动迭持续更新。

Pandas API参考所有内容目录

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: 创建一个数据副本,并在此副本里删除行或列,不会影响原数据。

errors 原地生效(是否在原始数据里直接修改)

  • errors : {‘ignore’, ‘raise’}, default ‘raise’

    errors 参数用于控制当发生错误时,是否报告错误内容,默认 errors= ‘raise’ 表示会中止当前操作并报告错误内容。:

    • ‘ignore’: 忽略,不报告错误;
    • ‘raise’: 停止操作,并报告错误内容。

Raises:

如果没有找到你传递的行索引、列名,会停中止当前操作,并引发 KeyError

相关方法:

?? 相关方法


示例:

测试文件下载:

本文所涉及的测试文件,如有需要,可在文章顶部的绑定资源处下载。

若发现文件无法下载,应该是资源包有内容更新,正在审核,请稍后再试。或站内私信作者索要。

测试文件下载位置.png

测试文件下载位置

例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
列名 →ABC
行索引 ↓
123
456
789

  • 例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
bigsmall
llamaspeed45.030.0
weight200.0100.0
length1.51.0
cowspeed30.020.0
weight250.0150.0
length1.50.8
falconspeed320.0250.0
weight1.00.8
length0.30.2

以删除 llama speed 这一行为例:

df.drop(("llama", "speed"))
bigsmall
llamaweight200.0100.0
length1.51.0
cowspeed30.020.0
weight250.0150.0
length1.50.8
falconspeed320.0250.0
weight1.00.8
length0.30.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)
列名 →ABC
行索引 ↓
456
789

例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-10-20-30-4
1 层列名1-11-21-21-4
2 层列名(底层)2-12-22-32-4
0 层行索引(顶层)1 层行索引(底层)
AX-0.612242-1.3863091.200706-0.435893
Y2.912622-0.4443680.3409081.159878
BX0.553297-0.003906-0.944363-0.515691
Y0.482624-0.488962-0.112784-0.366956

  • 例3-2、删除索引为X的如果使用元组传递给 labelsindex 参数,都会很麻烦,例如我要删除 1层 索引所有是 X 的行:
df.drop(index=[("A", "X"), ("B", "X")])  # 等效于df.drop(labels=[('A','X'),('B','X')], axis=0)
0 层列名(顶层)0-10-20-30-4
1 层列名1-11-21-21-4
2 层列名(底层)2-12-22-32-4
0 层行索引(顶层)1 层行索引(底层)
AY2.912622-0.4443680.3409081.159878
BY0.482624-0.488962-0.112784-0.366956

  • 例3-3、使用 level参数,可以实现同时删除 1层 索引所有是 X 的行,就很方便:
df.drop(index='X',level=1)
0 层列名(顶层)0-10-20-30-4
1 层列名1-11-21-21-4
2 层列名(底层)2-12-22-32-4
0 层行索引(顶层)1 层行索引(底层)
AY2.912622-0.4443680.3409081.159878
BY0.482624-0.488962-0.112784-0.366956
文章来源:https://blog.csdn.net/mingqinsky/article/details/135675346
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。