如何按二级索引删除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
相关产品推荐
相关产品推荐

