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
Post a Comment