回答问题

我有一个 MultiIndexed DataFrame df1,并希望以这样的方式循环它,以便在循环的每个实例中都有一个带有常规非分层索引的 DataFrame,它是对应于外部索引条目的 df1 的子集。即,如果我有:

第一表

我想得到

秒表

然后是 C1、C2 等。我也不知道这些名称实际上是什么(C1 等,只是这里的占位符),所以只想循环我拥有的 Ci 值的数量。

我一直在使用iterrows和各种循环,没有得到任何切实的结果,也不知道如何进行。我觉得应该存在一个简单的解决方案,但在文档中找不到任何看起来有用的东西,可能是由于我自己缺乏理解。

Answers

在这里使用来自的修改示例

In [30]: def mklbl(prefix,n):
        return ["%s%s" % (prefix,i)  for i in range(n)]
   ....: 

In [31]: columns = MultiIndex.from_tuples([('a','foo'),('a','bar'),
                                  ('b','foo'),('b','bah')],
                                   names=['lvl0', 'lvl1'])

In [33]: index = MultiIndex.from_product([mklbl('A',4),mklbl('B',2)])

In [34]: df = DataFrame(np.arange(len(index)*len(columns)).reshape((len(index),len(columns))),
               index=index,
               columns=columns).sortlevel().sortlevel(axis=1)

In [35]: df
Out[35]: 
lvl0     a         b     
lvl1   bar  foo  bah  foo
A0 B0    1    0    3    2
   B1    5    4    7    6
A1 B0    9    8   11   10
   B1   13   12   15   14
A2 B0   17   16   19   18
   B1   21   20   23   22
A3 B0   25   24   27   26
   B1   29   28   31   30

In [36]: df.loc['A0']
Out[36]: 
lvl0    a         b     
lvl1  bar  foo  bah  foo
B0      1    0    3    2
B1      5    4    7    6

In [37]: df.loc['A1']
Out[37]: 
lvl0    a         b     
lvl1  bar  foo  bah  foo
B0      9    8   11   10
B1     13   12   15   14

不需要循环。

您还可以选择这些以返回一个框架(带有原始 MI),例如df.loc[['A1']]

如果要获取索引中的值:

In [38]: df.index.get_level_values(0).unique()
Out[38]: array(['A0', 'A1', 'A2', 'A3'], dtype=object)
Logo

学AI,认准AI Studio!GPU算力,限时免费领,邀请好友解锁更多惊喜福利 >>>

更多推荐