python - 如何使用 .loc 和 MultiIndex 获取 Pandas DataFrame 中的值?

标签 python pandas dataframe indexing

这里是第一次海报。我无法理解 .loc适用于 DataFrame有一个 MultiIndex 。更具体地说,我对 2 级 MultiIndex 的情况感兴趣。我想通过第二级的标签选择值。

例如,使用 DataFrame loc 的文档中定义:

tuples = [
   ('cobra', 'mark i'), ('cobra', 'mark ii'),
   ('sidewinder', 'mark i'), ('sidewinder', 'mark ii'),
   ('viper', 'mark ii'), ('viper', 'mark iii')
]
index = pd.MultiIndex.from_tuples(tuples)
values = [[12, 2], [0, 4], [10, 20],
        [1, 4], [7, 1], [16, 36]]
df = pd.DataFrame(values, columns=['max_speed', 'shield'], index=index)
df

--------------------------------------
                     max_speed  shield
cobra      mark i           12       2
           mark ii           0       4
sidewinder mark i           10      20
           mark ii           1       4
viper      mark ii           7       1
           mark iii         16      36

我想选择mark ii对应的值,无论第一级标签如何。我可以使用xs :

df.xs("mark ii", level=1)

-----------------------------
            max_speed  shield
cobra               0       4
sidewinder          1       4
viper               7       1

我想我可以使用 loc :

df.loc[:, "mark ii"]

-------------------
KeyError: 'mark ii'

但是,如果执行以下操作,我会得到预期的结果:

df.loc[:, "mark ii", :]    # <-- note the added colon after 'mark ii'

-----------------------------
            max_speed  shield
cobra               0       4
sidewinder          1       4
viper               7       1

有人可以解释一下为什么df.loc[:, "mark ii"]在这里不起作用?

最佳答案

不能直接使用:来指定级别。 df.loc[:, "mark ii"] 意思是:选择所有行(:),以及“mark ii”列(不存在)。

正确的做法应该是使用IndexSlice :

df.loc[pd.IndexSlice[:, "mark ii"], :]

# or slice
df.loc[(slice(None), 'mark ii'), :]

您还可以在 loc 中指定轴:

df.loc(axis=0)[:, "mark ii"]

输出:

                    max_speed  shield
cobra      mark ii          0       4
sidewinder mark ii          1       4
viper      mark ii          7       1

关于python - 如何使用 .loc 和 MultiIndex 获取 Pandas DataFrame 中的值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/76211506/

相关文章:

python - 无法在 python 中的 search_slow 和 search_fast 算法中定义某些 "needle"

python - Pandas 分组和过滤器

dataframe - Julia - dataframe - 如何在 by() 中使用字符串进行自定义输出列命名

python - 根据另一列拆分 DataFrame 中的行(每小时)

python - 让 xml-rpc 和 django 协同工作的最佳方法

Python MySQL 日期时间格式

python - 每小时合并数据帧的观察结果

python - 如何将数据框中的对元组列表转换为列

python - 如何在 for 循环中附加 Pandas 数据框中的行?

python - 如何在 Python 3 中模拟 4 位整数?