当前位置: 首页 > 面试题库 >

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

锺离穆冉
2023-03-14
问题内容

我有3个级别的MultiIndex的熊猫数据框。我试图根据与两个级别相对应的值列表来提取此数据框的行。

我有这样的事情:

ix = pd.MultiIndex.from_product([[1, 2, 3], ['foo', 'bar'], ['baz', 'can']], names=['a', 'b', 'c'])
data = np.arange(len(ix))
df = pd.DataFrame(data, index=ix, columns=['hi'])
print(df)

           hi
a b   c      
1 foo baz   0
      can   1
  bar baz   2
      can   3
2 foo baz   4
      can   5
  bar baz   6
      can   7
3 foo baz   8
      can   9
  bar baz  10
      can  11

现在,我要获取索引级别为“ b”和“ c”的所有行:

ix_use = pd.MultiIndex.from_tuples([('foo', 'can'), ('bar', 'baz')], names=['b', 'c'])

即值的hi具有('foo', 'can')('bar', 'baz')在水平bc分别为:(1, 2, 5, 6, 9, 10)

所以我想slice(None)在第一级上学习一个,并在第二级和第三级上提取特定的元组。

最初,我认为将多索引对象传递给.loc会拉出我想要的值/级别,但这是行不通的。做这样的事情的最好方法是什么?


问题答案:

这是获取切片的一种方法:

df.sort_index(inplace=True)
idx = pd.IndexSlice
df.loc[idx[:, ('foo','bar'), 'can'], :]

屈服

           hi
a b   c      
1 bar can   3
  foo can   1
2 bar can   7
  foo can   5
3 bar can  11
  foo can   9

请注意,您可能需要先对MultiIndex排序,然后才能对其进行切片。好了,熊猫足以警告您是否需要这样做:

KeyError: 'MultiIndex Slicing requires the index to be fully lexsorted tuple len (3), lexsort depth (1)'

您可以在文档中阅读更多有关如何使用切片器的信息

如果由于某种原因无法使用切片器,则可以使用以下.isin()方法获取相同的切片:

df[df.index.get_level_values('b').isin(ix_use.get_level_values(0)) & df.index.get_level_values('c').isin(ix_use.get_level_values(1))]

这显然不是那么简洁。

更新:

对于您在此处更新的条件,可以采用以下方法:

cond1 = (df.index.get_level_values('b').isin(['foo'])) & (df.index.get_level_values('c').isin(['can']))
cond2 = (df.index.get_level_values('b').isin(['bar'])) & (df.index.get_level_values('c').isin(['baz']))
df[cond1 | cond2]

生产:

           hi
a b   c      
1 foo can   1
  bar baz   2
2 foo can   5
  bar baz   6
3 foo can   9
  bar baz  10


 类似资料:
  • 问题内容: 我在做下面的运动。 创建一个包含四个元素的切片。 创建一个新切片,并将第三个和第四个元素仅复制到其中。 我已经返回了以下程序 我程序的输出是。但我希望newElements切片为[3 4]- 我的程序出了什么问题。 问题答案: 使用内置的复制功能将元素从一个切片复制到另一个切片。 在操场上跑 您可以使用append创建切片并在单个语句中复制元素,但是代码并不像使用copy那样明显。 在

  • 我想把一个切片的末尾写到同一个切片的顶部。 我见过如何在锈菌阵列的两个可变切片上操作 我希望获得尽可能高的性能(例如,通过使用)。

  • 问题内容: 我有一些数据结构,我想将其中一个用作临时结构,将另一个用作非临时结构。 现在的问题当然是实际上只是指向,因此一旦清除,也是如此。 如何在使用Java时保留值? 问题答案: 您可以使用以下技巧: 或使用 您可以在此处获取有关clone()方法的一些信息 但是您应该记住,所有这些方式都会给您 List 的副本,而不是其所有元素。因此,如果您更改复制的列表中的元素之一,则它也将在原始列表中进

  • 问题内容: 我需要比较两个缓冲图像,看它们是否完全相同。只是说那等于是行不通的。我目前的方法是 但这并不能真正起作用。还有什么其他更可靠的方法? 问题答案: 显而易见的解决方案是逐像素比较它们是否相同。

  • 我有两位版画作家: 我想检查他们是否都打印到同一个文件,但与 或者 没用。此外,我希望能够检查打印作者是否像这两位一样打印到同一个位置,而不是带有文件路径的字符串: 有办法吗?

  • 问题内容: 问:我怎样才能从读到的一切入的方式是不是一个手工制作的循环用我自己的字节的缓冲区? 问题答案: 编写一个方法来执行此操作,然后从需要该功能的任何地方调用它。番石榴已经在中提供了代码。我敢肯定,几乎所有其他具有“通用” IO功能的库也都有它,但是Guava是我第一个“入门”库。它震撼了:)