HOWTO · Pandas

在 Pandas 中删除最后一行和最后一列

本教程演示如何在 Python 中删除 Pandas DataFrame 中的行和列。

本页内容

若要从 Pandas DataFrame 中恰好删除最后一个物理行,可用 df.iloc[:-1] 选取它之前的所有行。此操作会返回新的 DataFrame,不会修改 df,即使最后一个索引标签与其他行重复也是如此。若要删除最后 n 行,可在 n 为正数时使用 df.iloc[:-n];当 n 等于零时应单独处理,因为 [:-0] 不会选中任何行。空 DataFrame 没有最后一行,执行 df.iloc[:-1] 后仍为空。

在 Pandas 中使用 drop() 方法删除行和列

drop() 默认按索引标签删除行。若要按标签删除列,可传入 columns=;这种写法比更改 axis 更清楚。默认的 inplace=False 会返回新的 DataFrame,因此若要保留结果,需要将其赋值给变量。例如,df.drop(index=12) 会删除标签为 12 的行,而 df.drop(columns=["Q", "R"]) 会删除这些列。

运行下面的示例,从 DataFrame 中删除最后一行。代码和输出块保持原样,其中的英文标签也保留为英文;输出展示删除该行后的 DataFrame:

import pandas as pd

df = pd.DataFrame(
    {"name": ["Ada", "Lin", "Sam"], "score": [91, 84, 88]},
    index=[10, 11, 12],
)
result = df.iloc[:-1]
print(result)
   name  score
10  Ada     91
11  Lin     84

如果将 drop() 与 inplace=True 一起使用,原对象会被修改,而且该方法不会返回更新后的 DataFrame。示例代码和输出中的英文标签保持原样;输出展示了删除最后一行后的结果。

在 Pandas 多重索引 DataFrame 中使用 drop() 方法删除最后一行

使用 df.iloc[:-1] 时,MultiIndex 行由其位置确定,因此即使该行的索引元组之前也出现过,切片仍只会删除最后一行。相比之下,df.drop(df.index[-1]) 按标签选择,会删除所有索引元组相同的行。按位置切片不会删除最后一个第一层索引分组。若要删除最后 n 行,可在 n 为正数时使用 df.iloc[:-n];当 n 为零时保留所有行,当 n 大于或等于行数时,结果不包含任何行。

下面的示例重复使用最后一个 MultiIndex 元组,以展示 iloc 只会删除它最后一次出现的那一行。代码和输出块保持原样,其中的英文标签也保留为英文;输出展示删除最后一行后的结果。

import pandas as pd

index = pd.MultiIndex.from_tuples(
    [("deer", "speed"), ("deer", "weight"), ("dog", "speed"), ("dog", "speed")],
    names=["animal", "measure"],
)
df = pd.DataFrame({"value": [4, 12, 8, 9]}, index=index)
result = df.iloc[:-1]
remaining = list(zip(result.index.tolist(), result["value"].tolist()))
print(remaining)
[(('deer', 'speed'), 4), (('deer', 'weight'), 12), (('dog', 'speed'), 8)]

在 Pandas 中使用 drop() 方法删除最后一列

列位置从左侧的零开始计数;负数位置则从右侧倒数,因此 df.columns[-1] 会定位最后一列。若要一次删除最后 n 列,可选取切片 df.columns[-n:],并将其传给 drop(columns=...):

import pandas as pd

df = pd.DataFrame({"P": [0, 4, 8], "Q": [1, 5, 9], "R": [2, 6, 10], "S": [3, 7, 11]})
n = 2
result = df.drop(columns=df.columns[-n:])
print(result)
   P  Q
0  0  1
1  4  5
2  8  9

这里的 n = 2 会选中最右侧的两列。n 应为正数;当 n 等于零时,应保留原有列,而不要使用 [-n:],因为该切片会选中所有列。如果 n 大于列数,切片会选中所有列,结果 DataFrame 将不包含任何列。代码和输出块保持原样,其中的英文标签也保留为英文;输出展示删除所选末尾列后的 DataFrame。