python - Slice pandas DataFrame by MultiIndex level or sublevel -


inspired this answer , lack of easy answer this question found myself writing little syntactic sugar make life easier filter multiindex level.

def _filter_series(x, level_name, filter_by):     """     filter pd.series or pd.dataframe x `filter_by` on multiindex level     `level_name`      uses `pd.index.get_level_values()` in background. `filter_by` either     string or iterable.     """     if isinstance(x, pd.series) or isinstance(x, pd.dataframe):         if type(filter_by) str:             filter_by = [filter_by]          index = x.index.get_level_values(level_name).isin(filter_by)         return x[index]     else:         print "not pandas object" 

but if know pandas development team (and i'm starting to, slowly!) there's nice way this, , don't know yet!

am right?

i upvoted joris's answer... unfortunately refactoring mentions has not happened in 0.14 , not happening in 0.17 neither. moment let me suggest quick , dirty solution (obviously derived jeff's one):

def filter_by(df, constraints):     """filter multiindex sublevels."""     indexer = [constraints[name] if name in constraints else slice(none)                name in df.index.names]     return df.loc[tuple(indexer)] if len(df.shape) == 1 else df.loc[tuple(indexer),]  pd.series.filter_by = filter_by pd.dataframe.filter_by = filter_by 

... used as

df.filter_by({'level_name' : value}) 

where value can indeed single value, list, slice...

(untested panels , higher dimension elements, expect work)


Comments

Popular posts from this blog

apache - Remove .php and add trailing slash in url using htaccess not loading css -

javascript - jQuery show full size image on click -