Pandas 仅针对特定索引复制多索引

Pandas multiindex duplicated only for particular indices

假设我有一个包含多个索引的 Pandas 数据框:

arrays = [["UK", "UK", "US", "FR"], ["Firm1", "Firm1", "Firm2", "Firm1"], ["Andy", "Peter", "Peter", "Andy"]]
idx = pd.MultiIndex.from_arrays(arrays, names = ("Country", "Firm", "Responsible"))
df = pd.DataFrame(np.zeros(4), index = idx)
df

                             0
Country Firm  Responsible     
UK      Firm1 Andy         0.0
              Peter        0.0
US      Firm2 Peter        0.0
FR      Firm1 Andy         0.0

我想删除前两个索引级别的重复条目(在示例中,包含“UK”和“Firm1”条目的行)并仅保留第三个索引“Responsible”等于“安迪”。所以我想在这种情况下删除第二行。

在 pandas 中有 drop_duplicates() 但我不明白我怎么能 i) 仅将它应用于前两个索引级别和 ii) 指定保留带有“Andy”的行和删除其余部分(该函数仅允许 'first' 和 'last' 作为参数)

我很乐意提供意见!非常感谢。

一个简单的选项,删除最后一个级别并使用 Index.duplicated,然后将其与您想要的任何其他掩码组合:

df[~df.index.droplevel(2).duplicated()]
# or by name:
# df[~df.index.droplevel('Responsible').duplicated()]

输出:

                             0
Country Firm  Responsible     
UK      Firm1 Andy         0.0
US      Firm2 Peter        0.0
FR      Firm1 Andy         0.0

如果前 2 级重复且 Responsible 级中没有 Andy,则删除 - 第一级 snad keep=Fales 首先使用 Index.to_frame for DataFrame, test duplicates by DataFrame.duplicated 用于所有欺骗和过滤器 Andy 行由 | 链接另一个掩码用于按位 OR:

df1 = df.index.to_frame()

df = df[~df1.duplicated(subset=['Country','Firm'], keep=False) | 
         df1['Responsible'].eq('Andy')]
print (df)
                             0
Country Firm  Responsible     
UK      Firm1 Andy         0.0
US      Firm2 Peter        0.0
FR      Firm1 Andy         0.0