灵感来自 this answer并且缺乏对 this question 的简单答案我发现自己编写了一些语法糖,以便更轻松地按 MultiIndex 级别进行过滤。
def _filter_series(x, level_name, filter_by):
"""
Filter a pd.Series or pd.DataFrame x by `filter_by` on the MultiIndex level
`level_name`
Uses `pd.Index.get_level_values()` in the background. `filter_by` is either
a string or an iterable.
"""
if isinstance(x, pd.Series) or isinstance(x, pd.DataFrame):
if type(filter_by) is str:
filter_by = [filter_by]
index = x.index.get_level_values(level_name).isin(filter_by)
return x[index]
else:
print "Not a pandas object"
但如果我了解 pandas 开发团队(我正在慢慢了解!),已经有一个很好的方法来做到这一点,我只是还不知道它是什么!
我说得对吗?
最佳答案
我实际上赞成 joris 的回答...但不幸的是,他提到的重构在 0.14 中没有发生,在 0.17 中也没有发生。所以现在让我提出一个快速而肮脏的解决方案(显然来自 Jeff 的解决方案):
def filter_by(df, constraints):
"""Filter MultiIndex by sublevels."""
indexer = [constraints[name] if name in constraints else slice(None)
for 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
...用作
df.filter_by({'level_name' : value})
其中 value
确实可以是单个值,但也可以是列表、切片...
(未经面板和更高维元素测试,但我确实希望它能工作)
关于python - 按 MultiIndex 级别或子级别切片 pandas DataFrame,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22987015/