python - 按 MultiIndex 级别或子级别切片 pandas DataFrame

标签 python pandas

灵感来自 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/

相关文章:

python - 如何更改 PyDev 上的构建路径

python - 根据特定条件 pandas 增加列中的计数器

python - 导入错误 : cannot import name 'DtypeArg' from 'pandas

python - 扩展/ reshape Pandas 系列列的尺寸

python - 需要 Google App Engine 国际化帮助(Python)

python - Anaconda Keras 安装问题

python - 如何根据其他行和其他数据框在数据框中查找行

python - 使用 pandas 绘制 Bokeh 线图的问题

python - 两个列表的最大乘积和

python - 删除 lxml 中的所有命名空间?