gpt4 book ai didi

python - 从指定级别按多个值切片 MultiIndex DataFrame

转载 作者:太空狗 更新时间:2023-10-29 20:39:24 25 4
gpt4 key购买 nike

我想切片一个 MultiIndex DataFrame通过来自次要级别的多个值。例如,在以下 DataFrame 中:

                val1  val2
ind1 ind2 ind3
1 6 s1 10 8
2 7 s1 20 6
3 8 s2 30 4
4 9 s2 50 2
5 10 s3 60 0

我希望只对 ind3 == s1 ind3 == s3 的行进行切片:

           val1  val2
ind1 ind2
1 6 10 8
2 7 20 6
5 10 60 0

最佳假设选项是将多个参数传递给 .xs ,因为可以显式声明所需的 level

我显然可以连接所有按单值切片的数据帧:

In[2]: pd.concat([df.xs('s1',level=2), df.xs('s3',level=2)])
Out[2]:
val1 val2
ind1 ind2
1 6 10 8
2 7 20 6
5 10 60 0

但是 (a) 当使用超过 2 个值时,它很乏味且可读性差,(b) 对于大型 DataFrame,它非常重(或者至少比多值切片选项(如果存在))。

这是构建示例 DataFrame 的代码:

import pandas as pd
df = pd.DataFrame({'ind1':[1,2,3,4,5], 'ind2':[6,7,8,9,10], 'ind3':['s1','s1','s2','s2','s3'], 'val1':[10,20,30,50,60], 'val2':[8,6,4,2,0]}).set_index(['ind1','ind2','ind3'])

最佳答案

与 DataFrame 中的大多数选择一样,您可以使用掩码或索引器(在本例中为 loc)。

要获取掩码,您可以在 MultiIndex 上使用 get_level_values ( docs ),然后使用 isin ( docs )。

m = df.index.get_level_values('ind3').isin(['s1', 's3'])
df[m].reset_index(level=2, drop=True)

要使用loc:

df.loc[(slice(None), slice(None), ['s1', 's3']), :].reset_index(level=2, drop=True)

都输出

           val1  val2
ind1 ind2
1 6 10 8
2 7 20 6
5 10 60 0

注意:loc 方式也可以按照 Alberto Garcia-Raboso 的回答中的方式编写。许多人更喜欢这种语法,因为它与 Indexloc 语法更一致。 the docs 中讨论了这两种语法样式.

关于python - 从指定级别按多个值切片 MultiIndex DataFrame,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38774134/

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