Pandas多级索引:如何删除一级索引下二级索引唯一的行
Pandas三级索引DataFrame处理方案
一、保留三级索引值相同但二级索引值不同的数据
要实现保留三级索引(Index2)值相同,但对应二级索引(Index1)值不唯一的行,可按以下步骤操作:
- 按三级索引分组,统计每组内二级索引的唯一值数量
- 筛选出二级索引唯一值数量大于1的三级索引值
- 用这些值过滤原DataFrame
代码示例(假设索引已命名为idx1(一级)、idx2(二级)、idx3(三级)):
# 统计每个三级索引对应的二级索引唯一数量 idx3_valid = df.groupby(level='idx3')['idx2'].nunique() > 1 # 提取符合条件的三级索引值 valid_idx3_list = idx3_valid[idx3_valid].index # 过滤DataFrame filtered_df = df[df.index.get_level_values('idx3').isin(valid_idx3_list)]
如果索引未命名,可通过层级位置(level=0一级、level=1二级、level=2三级)操作:
# 按三级索引(level=2)分组,统计二级索引(level=1)的唯一数量 idx3_valid = df.groupby(level=2).apply(lambda x: x.index.get_level_values(1).nunique()) > 1 valid_idx3_list = idx3_valid[idx3_valid].index filtered_df = df[df.index.get_level_values(2).isin(valid_idx3_list)]
二、统计一级索引对应的二级索引数量并删除数量为1的行
要统计每个一级索引下的二级索引数量,并删除数量为1的行,步骤如下:
- 按一级索引分组,统计每组内二级索引的唯一值数量
- 筛选出二级索引数量大于1的一级索引值
- 过滤原DataFrame保留符合条件的行
代码示例:
# 统计每个一级索引对应的二级索引唯一数量 idx1_valid = df.groupby(level='idx1')['idx2'].nunique() > 1 # 提取符合条件的一级索引值 valid_idx1_list = idx1_valid[idx1_valid].index # 过滤DataFrame final_df = filtered_df[filtered_df.index.get_level_values('idx1').isin(valid_idx1_list)]
也可以用transform方法直接在原DataFrame标记后筛选,更简洁:
# 给每行添加对应一级索引下的二级索引数量列 df['idx2_count'] = df.groupby(level='idx1')['idx2'].transform('nunique') # 筛选出数量大于1的行,最后删除辅助列 final_df = df[df['idx2_count'] > 1].drop(columns='idx2_count')
内容的提问来源于stack exchange,提问作者encrypted-ninja
相关产品推荐
相关产品推荐

