是否有一种方法可以构造一个使用“ 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')]
所以,我想放置一个任意多个级别的列表和一个相同数量的值的列表,并返回切片的数据帧。
非常感谢您的帮助!
尝试一下,看看它是否对您有用:由于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