类似于如何根据MultiIndex的一个级别选择DataFrame的子集,让
df = pd.DataFrame({"v":range(12)},
index=pd.MultiIndex.from_frame(
pd.DataFrame({"name":4*["a"]+4*["b"]+4*["c"],
"rank":[x*x for x in range(12)]})))
并假设我只想选择second级别
rank
在给定first级别的最小值的25以内的行name
:
v
name rank
a 0 0
1 1
4 2
9 3
b 16 4
25 5
36 6
c 64 8
81 9
这一次我不知道如何轻松地做到这一点(除了
to_frame
和 groupby
的复杂组合 - 如 如何根据列上的条件选择 DataFrame 的子集中所述)。
很像,可以用reset_index和groupby获取min rank,然后查询:
# select only one column `v` so we don't copy too many data
min_rank = (df['v'].reset_index('rank')
.groupby('name', sort=False)['rank'] # avoid shuffling the dataframe
.transform('min')
.to_numpy() # avoid index alignment
)
# pass the variable into query string with @
df.query('rank < @min_rank + 25')
# also
# df.loc[df.index.get_level_values('rank') < min_rank + 25]
输出:
v
name rank
a 0 0
1 1
4 2
9 3
b 16 4
25 5
36 6
c 64 8
81 9