假设我有一个带有多个索引的 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”的行并删除其余行(该函数仅允许'第一个”和“最后一个”作为参数)
我很乐意提供意见!非常感谢。
如果前 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
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