You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何按二级索引删除Pandas多级索引DataFrame重复行并保留最后实例

解决多级索引DataFrame删除二级索引重复行(保留最后实例)的问题

要实现保留每个二级索引最后出现的行,直接针对二级索引判断重复即可,不用纠结drop_duplicates()的列参数,具体步骤如下:

方法一:直接基于索引判断重复

利用index.get_level_values()提取二级索引,结合duplicated()标记重复项(keep='last'保留最后一个实例),最后筛选出非重复的行:

import numpy as np
import pandas as pd

# 生成示例DataFrame
arrays = [
    np.array(["foo", "foo", "foo", "bar", "bar", "bar", "bar", "bar"]),
    np.array(["one", "two", "three", "four", "one", "two", "five", "six"]),
]
df = pd.DataFrame(np.random.randn(8, 2), index=arrays)

# 生成过滤掩码:标记二级索引重复的行(除了最后一个实例)
mask = df.index.get_level_values(1).duplicated(keep='last')
# 筛选出非重复的行
df_filtered = df[~mask]

运行后df_filtered的结果会是:

0         1
foo three  0.364116  0.385614
bar four   0.436584 -0.042120
    one    0.404953  0.410876
    two    1.695568 -1.475434
    five  -0.696704  1.226981
    six    1.640631  0.518874

正好符合你要删除("foo", "one")和("foo", "two")的需求。

方法二:重置索引后用drop_duplicates

如果习惯用drop_duplicates(),可以先把索引转成列,处理后再恢复索引:

df_reset = df.reset_index()
# 按二级索引(level_1)去重,保留最后一个实例
df_filtered = df_reset.drop_duplicates(subset='level_1', keep='last').set_index(['level_0', 'level_1'])

这种方法和第一种效果完全一致,只是多了索引转换的步骤。

为什么你之前的尝试失败?

drop_duplicates()的subset参数默认是针对数据列的,你没指定索引列的话,它只会检查数值列的重复,所以无法达到针对二级索引去重的目的。

内容的提问来源于stack exchange,提问作者Nikko Cleri

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.12 21:13:12