使用Pandas多级索引查找一级索引下满足条件的二级索引不唯一的行
解决方案
核心思路
由于同一(ID, File)组合对应的Tag值完全一致,我们可以先对(ID, File)去重,再按一级索引ID分组,统计每个分组内Tag=True的唯一File数量,最终筛选出存在多个Tag=True的File的分组及对应记录。
步骤1:去重处理
首先去除(ID, File)的重复行,保留每个组合的唯一Tag值:
import pandas as pd d = {'ID': [1, 1, 1, 1, 1, 2, 2, 2, 2, 2], 'File': ['a', 'a', 'b', 'b', 'c', 'd', 'd', 'e', 'e', 'f'], 'Tag': [False, False, True, True, False, True, True, False, False, True]} df = pd.DataFrame(data=d) df.set_index(['ID', 'File'], inplace=True) # 去重:保留每个(ID, File)的唯一记录 unique_df = df.reset_index().drop_duplicates(subset=['ID', 'File']).set_index(['ID', 'File'])
步骤2:标记存在多个True File的ID
按ID分组,统计每个分组内Tag=True的File数量,为符合条件的记录打上标记:
# 对每个ID,判断是否存在多个Tag=True的File unique_df['multiple_true'] = unique_df.groupby('ID')['Tag'].transform(lambda x: x.sum() > 1)
步骤3:筛选目标记录
提取Tag=True且所属ID存在多个True File的记录:
result = unique_df[(unique_df['Tag']) & (unique_df['multiple_true'])] print(result)
运行结果:
Tag multiple_true ID File 2 d True True f True True
关于duplicated方法的问题
你之前使用df.duplicated(keep=False)返回全True,是因为该方法默认检查整行数据的重复——原数据中同一(ID, File)的行完全重复,因此全部被标记为重复值,这和你需要的「按ID分组检查不同File的Tag情况」逻辑不符,所以无法得到预期结果。
内容的提问来源于stack exchange,提问作者bowen_arrow
相关产品推荐
相关产品推荐

