在熊猫中循环使用MultiIndex

时间:2014-07-17 15:21:39

标签: python pandas multi-index

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

FirstTable

我想要

SecondTable

以及随后的C1,C2等我也不知道这些名称究竟是什么(C1等,只是这里的占位符),所以只想循环C的数量我有 i 的值。

我一直在与iterrows和各种循环一起磕磕绊绊,没有取得任何实际成果,也不知道如何继续。我觉得应该存在一个简单的解决方案但是找不到任何在文档中看起来有用的东西,可能是因为我自己缺乏理解。

2 个答案:

答案 0 :(得分:7)

使用here

中的修改示例
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)

答案 1 :(得分:1)

你想做这样的事吗?

for i in set(df.index):
    print df.loc[i].reset_index()
  1. set(df.index)返回多索引(层次索引)的一组唯一元组。
  2. df.loc[i].reset_index() ... df.loc[i]当然会返回原始数据框的子集,而.reset_index()部分会将索引转换为列