python - 如何在新数据框中存储多索引数据框的子集?

标签 python pandas select dataframe multi-index

我有一个像这样的多索引数据框:

import pandas as pd
import numpy as np


df = pd.DataFrame({'ind1': list('aaaaaaaaabbbbbbbbb'),
                   'ind2': list('cccdddeeecccdddeee'),
                   'ind3': list(range(3))*6,
                   'val1': list(range(100, 118)),
                   'val2': list(range(70, 88))})

df_mult = df.set_index(['ind1', 'ind2', 'ind3'])

                val1  val2
ind1 ind2 ind3            
a    c    0      100    70
          1      101    71
          2      102    72
     d    0      103    73
          1      104    74
          2      105    75
     e    0      106    76
          1      107    77
          2      108    78
b    c    0      109    79
          1      110    80
          2      111    81
     d    0      112    82
          1      113    83
          2      114    84
     e    0      115    85
          1      116    86
          2      117    87

我现在可以像这样使用 .loc 选择它的一个子集

df_subs = df_mult.loc['a', ['c', 'd'], :]

这给出了预期的

                val1  val2
ind1 ind2 ind3            
a    c    0      100    70
          1      101    71
          2      102    72
     d    0      103    73
          1      104    74
          2      105    75

如果我现在想再次选择 df_subs 的一个子集,例如

df_subs.loc['a', 'c', :]

工作和给予

      val1  val2
ind3            
0      100    70
1      101    71
2      102    72

不过

df_subs.loc[:, 'c', :]

失败并报错

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

为什么会失败?

编辑

最初,我在这篇文章中有两个问题。我拆成两份,第二题可以查到here .

最佳答案

通过使用 IndexSlice:

idx = pd.IndexSlice
df_subs.loc[idx[:, 'c',:],:]
Out[159]: 
                val1  val2
ind1 ind2 ind3            
a    c    0      100    70
          1      101    71
          2      102    72

或者您需要对行或列进行特定切片

df_subs.loc(axis=0)[:, 'c', :]
Out[196]: 
                val1  val2
ind1 ind2 ind3            
a    c    0      100    70
          1      101    71
          2      102    72

.loc[:, 'c', :] 无法运行的原因:

您应该在 .loc 说明符中指定所有轴,这意味着索引和列的索引器。在某些不明确的情况下,传递的索引器可能会被错误解释为对两个轴进行索引,而不是说行的 MuliIndex。

Link1

Link2

关于python - 如何在新数据框中存储多索引数据框的子集?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46623606/

相关文章:

python - 最Pythonic的方式来中止缓存装饰器?

MySQL Select 语句在某一列上没有返回任何匹配项

MySQL 查询正则表达式

Python,单步执行文件夹(以运行脚本)

python - 如何从实时应用程序中检测特定声音?

Python 如何在 BeautifulSoup 中提取具有相同类名的数据

用于 Google 表格的 Python : Create new sheet (in the same workbook) automatically and write a new dataframe into it

python - 根据两列计算唯一值的出现次数

python - 过滤后在 Pandas 中添加每组出现的列和值

c++ - 使用 C++ 和标准 C 库以异步方式实现套接字连接读取超时处理的最佳方法