【问题标题】:In Python's Pandas, how do I filter a DataFrame on a Field in a MultiIndex在 Python 的 Pandas 中,如何在 MultiIndex 中的字段上过滤 DataFrame
【发布时间】:2021-03-03 03:07:53
【问题描述】:

我有这个 DataFrame,它有一个 MultiIndex,字段为 Hi、Md、Lo

import pandas as pd

df = pd.DataFrame(
    [
        ["A", "X", "C", "7", "3"],
        ["A", "B", "C", "7", "2"],
        ["A", "B", "C", "7", "1"],
        ["A", "X", "C", "7", "3"],
        ["1", "2", "3", "7", "3"],
        ["4", "5", "6", "7", "3"],
    ],
    columns=["Hi", "Md", "Lo", "O", "I"],
).set_index(["Hi", "Md", "Lo"])

看起来像这样

          O  I
Hi Md Lo      
A  X  C   7  3
   B  C   7  2
      C   7  1
   X  C   7  3
1  2  3   7  3
4  5  6   7  3

如何设置过滤器以仅获取 Md 具有值 B

的行

我尝试通过字段名

df[df['Md'] == 'B']

这会引发 KeyError,因为“字段”不是列,而是 MultiIndex 的一部分

df[df.index.map(lambda x: x[1] == 'B')]

有效,但非常hacky。

有没有更短的方法来编写这个过滤器,可能使用字段名称Md或索引位置1?

【问题讨论】:

标签: python pandas filter multi-index


【解决方案1】:

您可以使用DataFrame.query

df.query("Md == 'B'")

输出

          O  I
Hi Md Lo      
A  B  C   7  2
      C   7  1

替代方案(可能不适用于不同的数据)

df.filter(like='B', axis=0)

【讨论】:

    【解决方案2】:

    这是一种将元组传递给df.loc的方法

    df.loc[(slice(None),'B',slice(None))]
    

    【讨论】:

      猜你喜欢
      • 2017-08-25
      • 2020-09-30
      • 2022-12-07
      • 2023-04-08
      • 1970-01-01
      • 1970-01-01
      • 2019-05-24
      相关资源
      最近更新 更多