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

问题描述 投票:0回答:2

假设我有一个带有多个索引的 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”等于“Andy”的行。所以在这种情况下我想删除第二行。

在pandas中,有

drop_duplicates()
,但我不知道如何i)仅将其应用于前两个索引级别,ii)指定保留带有“Andy”的行并删除其余行(该函数仅允许'第一个”和“最后一个”作为参数)

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

python pandas multi-index drop-duplicates
2个回答
5
投票

如果前 2 个级别重复且

Andy
未出现在
Responsible
级别中,您想要删除条目:首先使用
Index.to_frame
表示
DataFrame
,然后使用 测试前 2 个级别是否有重复项
DataFrame.duplicated
,为所有重复项设置
keep=False
参数。最后,通过使用按位“
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

3
投票

一个简单的选项,删除最后一个级别并使用

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
© www.soinside.com 2019 - 2024. All rights reserved.