类似于如何根据MultiIndex的一个级别选择DataFrame的子集,让
df = pd.DataFrame({"v":[x*x for x in range(12)]},
index=pd.MultiIndex.from_product([["a","b","c"],[1,2,3,4]]))
并假设我只想选择
v
与给定first级别的最小值相差25以内的行:
v
a 1 0
2 1
3 4
4 9
b 1 16
2 25
3 36
c 1 64
2 81
这一次我不知道如何轻松地做到这一点......
您可以按数据框的级别 0 进行分组,并获得每个组中
v
列的最小值。然后对每组中的v
和最小的v
进行比较。
out = df[df['v'].sub(df.groupby(level=0)['v'].transform('min')) < 25]
print(out)
v
a 1 0
2 1
3 4
4 9
b 1 16
2 25
3 36
c 1 64
2 81
如果你想在 multiindex 的 level 1 中找到最小值,你可以这样做
out = df[((df.index.get_level_values(level=-1) -
df.reset_index(level=-1).groupby(level=0)['level_1'].transform('min'))
# or without reset index
# df.groupby(level=0).transform(lambda g: g.index.get_level_values(level=-1).min())
< 25).values]