为啥 pandas 多索引数据帧切片看起来不一致?

Posted

技术标签:

【中文标题】为啥 pandas 多索引数据帧切片看起来不一致?【英文标题】:Why does pandas multi-index dataframe slicing seem inconsistent?为什么 pandas 多索引数据帧切片看起来不一致? 【发布时间】:2016-12-13 11:23:11 【问题描述】:

为什么在对多索引数据帧进行切片时,只要对 0 级索引进行切片,就可以使用更简单的语法?这是一个示例数据框:

           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

这些工作:

df.loc[1, 'foo', :]
df.loc[1, :, 'can']

虽然不是这样:

df.loc[:, 'foo', 'can']

强迫我改用其中一种:

df.loc[(slice(None), 'foo', 'can'), :]
df.loc[pd.IndexSlice[:, 'foo', 'can'], :]

以下是相同的示例,但更详细:

In [1]: import pandas as pd
import numpy as np

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

In [2]: df.sort_index(inplace=True)
print df.loc[1, 'foo', :]

           hi
a b   c      
1 foo baz   0
      can   1

In [3]: print df.loc[1, :, 'can']

           hi
a b   c      
1 bar can   3
  foo can   1

In [4]: print df.loc[:, 'foo', 'can']

KeyError: 'the label [foo] is not in the [columns]'

In [5]: print df.loc[(slice(None), 'foo', 'can'), :]

           hi
a b   c      
1 foo can   1
2 foo can   5
3 foo can   9

In [6]: print df.loc[pd.IndexSlice[:, 'foo', 'can'], :]

           hi
a b   c      
1 foo can   1
2 foo can   5
3 foo can   9

【问题讨论】:

【参考方案1】:

所有三个例子在技术上都是模棱两可的,但在前两个例子中,Pandas 正确地猜出了你的意图。由于切片行、选择列(即df.loc[:, columns])是一种常见的习惯用法,因此推断似乎选择了这种解释。

推理有点混乱,所以我认为最好是明确的。如果您使用别名 IndexSlice,则不需要额外输入:

idx = pd.IndexSlice
df.loc[idx[1, 'foo'], :]
df.loc[idx[1, :, 'can'], :]
df.loc[idx[:, 'foo', 'can'], :]

【讨论】:

df[columns] 似乎在做同样的事情时,为什么df.loc[:, columns] 是一个常见的习语?我可能遗漏了一些细微差别。 它通常做同样的事情......除非它不是由于后备。 github 上有一个问题,它列举了所有的可能性 - github.com/pydata/pandas/issues/9595 - 正如那里所指出的,它有点混乱,此时主要是为了向后兼容。

以上是关于为啥 pandas 多索引数据帧切片看起来不一致?的主要内容,如果未能解决你的问题,请参考以下文章

使用索引值列表对 pandas 多索引数据框进行切片 [重复]

Pandas:按整数进行多索引二级切片

将 Pandas 数据帧与多索引列和不规则时间戳连接起来

将熊猫多索引切片彼此分开

pandas中的多索引(时间序列)切片错误

熊猫切片多索引数据框