当前位置: 首页 > 知识库问答 >
问题:

通过特定索引值过滤带有MultiIndex的数据框[重复]

陆城
2023-03-14

我每年使用许多场景来预测产品的需求。我有一个多索引的数据帧(模拟、年、月),需要按其中一个进行过滤(比如模拟)。

import pandas as pd
idx = pd.MultiIndex.from_tuples([(1,2020,1), (1,2020,2), (2,2020,1), (2,2020,2)], 
                                 names=['Simulation', 'Year', 'Month'])
d = {'Apples': [1,2,3,4], 'Organes': [4,5,6,8], 'Lemons': [9,10,11,12]}
df = pd.DataFrame(d, index=idx)
print(df)
Simulation   Year    Month     Apples  Oranges  Lemons
1            2020    1         1       4        9
1                    2         2       5        10
2            2020    1         3       6        11
2                    2         4       8        12

如何按模拟进行筛选?

仅按模拟编号1进行过滤的预期输出

Simulation   Year    Month     Apples  Oranges  Lemons
1            2020    1         1       4        9
1                    2         2       5        10

共有1个答案

闾丘京
2023-03-14

假设您要在“模拟”为 1 的位置编制索引,则可以将index.get_level_values用作:

df[df.index.get_level_values(0) == 1]

                        Apples  Oranges  Lemons
Simulation Year Month                         
1          2020 1          10       30      10
                2          25       50       5
           2030 12         30       70       5

对于多个值,您可以在列表中的值末尾添加isin

df.loc[df.index.get_level_values(0).isin([1, 2])]


                        Apples  Oranges  Lemons
Simulation Year Month                         
1          2020 1          10       30      10
                2          25       50       5
           2030 12         30       70       5
2          2020 1          15       25      10
                2          20       50      15

get_level_values基本上是返回一个 Int64Index,其中包含沿第一个轴的所有索引:

df.index.get_level_values(0)
# Int64Index([1, 1, 1, 2, 2, 50], dtype='int64', name='Simulation') 

然后,我们可以使用该结果沿感兴趣的轴对数据帧执行布尔索引。

也可以使用<code>pd.indexlice</code>:

df.loc[pd.IndexSlice[[1,2], :, :]]

                        Apples  Oranges  Lemons
Simulation Year Month                         
1          2020 1          10       30      10
                2          25       50       5
           2030 12         30       70       5
2          2020 1          15       25      10
                2          20       50      15
 类似资料:
  • 问题内容: 从这里开始。该解决方案仅适用于一列。如何改进多列解决方案。即如果我有一个像 如何重塑像 如果df是 然后 问题答案: 采用 要么, 另外,索引不相等

  • 问题内容: 我正在寻找一种简洁的方法来过滤特定索引处的列表中的项目。我的示例输入如下所示: 我想在指标筛选出的项目,,,。我有一个for循环,它跳过与索引匹配的项目,但我希望可以有一种使用流的简单方法。最终结果将如下所示: 问题答案: 您可以生成一个模拟原始列表的索引,然后删除列表中的索引,然后将这些索引映射到列表中的相应元素(一种更好的方法是使用for索引,因为它们是唯一的定义,以便进行恒定时间

  • 问题内容: 我有一个数据框 ,它有一 列。我想创建两个新的数据框。一个包含 年份等于的所有行 ,另一个数据框包含 年份不等于的所有行 。我知道您可以这样做,`df.ix[‘2000-1-1’ ‘2001-1-1’]`但是为了获得2000年中没有的所有行,需要创建2个额外的数据帧,然后进行串联/联接。 有这样的办法吗? 这段代码不起作用,但是有什么类似的方法吗? 问题答案: 您可以使用datetim

  • 例如,假设我们有: 如果我这样做: 我总是得到0或1,因为它会搜索与值匹配的第一个匹配项。我如何精确地通过索引引用数组中的元素?也就是说,在这种情况下如何获得“0、1、2、3、4”?或者甚至使用多个维度的数组。

  • 问题内容: 我有一系列元素。我还有一个IndexSet,它指定需要将数组的哪些索引提取到新数组中。例如: 我正在寻找使用swift 函数的方法,但是还没有答案。我怎样才能做到这一点? 问题答案: 是递增整数的集合,因此可以 将 每个索引 映射 到相应的数组元素: 假定所有索引对于给定数组均有效。如果不能保证,则可以过滤索引(如@dfri正确标记):

  • 我正在读取一个文本文件,test.csv,具有给定的内容: 我将一个日期作为参数,它是一个格式为“2020-03-15”的字符串,如果分值为-1,我将尝试获取一个与给定日期相关联的行: 它给出了一个错误,我无法获得与日期“2020-03-08”相关的行。也请考虑我需要将日期列设置为索引。