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
假设我有一个包含多个索引的 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