gpt4 book ai didi

python - 如何使用 MultiIndex 索引和 MultiIndex 列对 Pandas DataFrame 进行切片?

转载 作者:行者123 更新时间:2023-12-02 03:05:18 31 4
gpt4 key购买 nike

我希望创建一个新的 DataFrame,与基于芯片的设备 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

这是表格的图像。 Picture of data

这是我认为会起作用的代码,但它只是给了我错误,所以现在我不知道该尝试什么,机器人[(robot.Device=="A") & (robot.Device=="B")][["Silicon"]]

最佳答案

我想你想要这样的东西:

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),它获取图像中显示的 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])

如果除了硅之外还有更多元素,您可以使用 | 运算符(而不是 & 运算符),如下所示:

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 的所有级别的所有值)来过滤索引,这与我们过滤列的方式相同。

关于python - 如何使用 MultiIndex 索引和 MultiIndex 列对 Pandas DataFrame 进行切片?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59171055/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com