Multiindex“ get_level_values”-任意多个级别的函数

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

是否有一种方法可以构造一个使用“ get_level_values”任意次并返回切片数据帧的函数?一个例子可以解释我的需求。

多索引:

arrays = [['bar', 'bar', 'bar', 'baz', 'baz', 'foo', 'foo','foo','qux', 'qux'],
          ['one', 'two', 'three', 'one', 'four', 'one', 'two', 'eight','one', 'two'],
          ['green', 'green', 'blue', 'blue', 'black', 'black', 'orange', 'green','blue', 'black']  ]
s = pd.DataFrame(np.random.randn(10), index=arrays)
s.index.names = ['p1','p2','p3']

s
                         0
p1  p2    p3              
bar one   green  -0.676472
    two   green  -0.030377
    three blue   -0.957517
baz one   blue    0.710764
    four  black   0.404377
foo one   black  -0.286358
    two   orange -1.620832
    eight green   0.316170
qux one   blue   -0.433310
    two   black   1.127754

现在,这是我要创建的功能:

def my_func(df,levels, values):
    # Code using get_level_values
    return ret

# Example use
my_func(s, ['p1'],['bar'])

p1  p2    p3              
bar one   green  -0.676472
    two   green  -0.030377
    three blue   -0.957517

my_func(s, ['p1','p2'],['bar','one'])

p1  p2    p3              
bar one   green  -0.676472

my_func(['p1'],['bar'])之上返回s.loc[s.index.get_level_values('p1')=='bar']my_func(['p1','p2'],['bar','one'])返回s.loc[(s.index.get_level_values('p1')=='bar') & (s.index.get_level_values('p2')=='one')]

所以,我想放置一个任意多个级别的列表和一个相同数量的值的列表,并返回切片的数据帧。

非常感谢您的帮助!

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

尝试一下,看看它是否对您有用:由于ur multiindex有名称,因此使用query来实现您的功能更容易:

def my_func(df,levels, values):
    # Code using query
    m = dict(zip(levels,values))
    #create expression to use in the query method
    expr = " and ".join(f"{k}=={v!r}" for k,v in m.items())
    ret = df.query(expr)
    return ret


#function application
my_func(s, ['p1'],['bar'])

                    0
p1  p2  p3  
bar one green   -0.087366
    two green   1.126620
  three blue    0.868515


my_func(s, ['p1','p2'],['bar','one'])

                    0
p1  p2  p3  
bar one green   -0.087366
© www.soinside.com 2019 - 2024. All rights reserved.