如何切片具有MultiIndex索引和MultiIndex列的Pandas DataFrame?

我正在寻找一个新的DataFrame,它对应于基于Silicon的设备A和B的结果。

以下是我用于创建DataFrame的代码:

import numpy as np
import pandas as pd

x = np.array(
    [
        [0.26, 0.92, 0.05, 0.43],
        [1.00, 0.62, 1.00, 1.00],
        [1.00, 0.97, 0.04, 1.00],
        [0.00, 1.00, 1.00, 0.88],
        [1.00, 1.00, 1.00, 0.79],
        [0.98, 1.00, 0.79, 0.99],
        [0.99, 1.00, 1.00, 1.00],
        [0.18, 1.00, 0.26, 1.00],
        [0.22, 0.00, 0.34, 0.82],
    ]
)
rowIndx = pd.MultiIndex.from_product(
    [["Slurm", "Zoidberg", "Wernstrom"], ["A", "B", "C"]],
    names=["Laboratory", "Device"],
)
colIndex = pd.MultiIndex.from_product(
    [["Replicant 1 ", "Replicant 2 "], ["Silicon", "Carbon"]]
)
robot = pd.DataFrame(data=x, index=rowIndx, columns=colIndex)
robot

这是桌子的图像。 资料图片

这是我认为可以使用的代码,但它只会给我带来错误,所以现在我不知道该怎么做, robot[(robot.Device=="A") & (robot.Device=="B")][["Silicon"]]

charlesreid1

我想你想要这样的东西:

In [6]: robot.loc[:, (robot.columns.get_level_values(level=1)=='Silicon')]
Out[6]:
                  Replicant 1  Replicant 2
                       Silicon      Silicon
Laboratory Device
Slurm      A              0.26         0.05
           B              1.00         1.00
           C              1.00         0.04
Zoidberg   A              0.00         1.00
           B              1.00         1.00
           C              0.98         0.79
Wernstrom  A              0.99         1.00
           B              0.18         0.26
           C              0.22         0.34

这里有两个关键事项:第一个关键是使用robot.loc[ _ , _ ](指定两个参数,一个用于索引,一个用于列);这必须是您的MultiIndex类型索引和MultiIndex类型列可以理解的东西。

第二个键是robots.columns.get_level_values(level=1),它为DataFrame图像中显示的4列获取级别1(碳/硅)的4列标签:

In [7]: robot.columns.get_level_values(level=1)
Out[7]: Index(['Silicon', 'Carbon', 'Silicon', 'Carbon'], dtype='object')

然后根据给定条件过滤要显示的列:

In [8]: robot.columns.get_level_values(level=1)=='Silicon'
Out[8]: array([ True, False,  True, False])

如果除了Silicon之外还有其他元素,则可以这样使用|运算符(而不是&运算符):

robot.loc[:, (robot.columns.get_level_values(level=1)=='Silicon')|(robot.columns.get_level_values(level=1)=='Carbon')]

或更短:

lv = robot.columns.get_level_values(level=1)
robot.loc[:, (lv=='Silicon')|(lv=='Carbon')]

更新:如果您还想过滤索引中的值,可以使用robot.index.get_level_values()代替robot.columns.get_level_values()这是一个例子:

lv = robot.columns.get_level_values(level=1)
ilv = robot.index.get_level_values(level=1)
robot.loc[(ilv=='A')|(ilv=='B'), (lv=='Silicon')]

我们已经用:逻辑掩码替换了(这表示MultiIndex的所有级别的所有值)来过滤索引,就像过滤列一样。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

Pandas 1.0.1-如何使用包含切片器的列表为具有MultiIndex的DataFrame编制索引

索引与MultiIndex的Pandas Dataframe日期时间切片

使用基于索引的条件对MultiIndex DataFrame进行切片

使用索引值列表对Pandas MultiIndex DataFrame进行切片

按位置切片MultiIndex pandas DataFrame

具有MultiIndex列的Pandas DataFrame中的布尔索引

如何为带有多索引的pandas DataFrame的切片分配新列?

如何使用MultiIndex的相关级别对MultiIndex DataFrame进行切片

具有按相邻列值的多索引的 DataFrame 切片

如何将一个MultiIndex DataFrame与另一个的MultiIndex切片

取消透视/带有MultiIndex列和行的melt()Pandas DataFrame时缺少索引

根据列值对具有MultiIndex的pandas DataFrame进行排序

在具有multiindex的pandas Dataframe中,如何按顺序过滤?

如何按列值切片过滤 Pandas DataFrame

Pandas - 使用 MultiIndex DataFrame 的索引切入 DataFrame

具有MultiIndex的DataFrame的.loc和.iloc

如何切片pandas.DataFrame?

将 DataFrame 对象上的 Pandas 日期时间索引转换为具有“月”和“年”级别的 *MultiIndex*

如何使用Python Pandas在特定切片中制作DataFrame和“ fillna”切片?

熊猫MultiIndex切片和索引

创建具有MultiIndex的DataFrame

根据指定级别的多个值对MultiIndex DataFrame进行切片

使用其他列的索引对DataFrame进行切片

切片过滤的DataFrame或系列(切片带有负索引的观察结果)

熊猫如何在Multiindex DataFrame中获取对索引级别具有多个值的行的列表

如何使用日期索引和多层列(MultiIndex)进行切片

如何在MultiIndex Pandas DataFrame中设置索引值?

在 Pandas 中对 DataFrame 进行排序和切片

向具有值和列表的MultiIndex pandas DataFrame添加新行