如何根据 MultiIndex 的一个级别上的条件选择 DataFrame 的子集

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

类似于如何根据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 的子集中所述)。

python pandas dataframe multi-index
1个回答
0
投票

很像,可以用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
© www.soinside.com 2019 - 2024. All rights reserved.