我有一个MultiIndexed DataFrame df1,并希望以这样的方式循环它,在循环的每个实例中都有一个带有常规非分层索引的DataFrame,它是与外部索引对应的df1的子集条目。即,如果我有:
我想要
以及随后的C1,C2等我也不知道这些名称究竟是什么(C1等,只是这里的占位符),所以只想循环C的数量我有 i 的值。
我一直在与iterrows
和各种循环一起磕磕绊绊,没有取得任何实际成果,也不知道如何继续。我觉得应该存在一个简单的解决方案但是找不到任何在文档中看起来有用的东西,可能是因为我自己缺乏理解。
答案 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()
set(df.index)
返回多索引(层次索引)的一组唯一元组。df.loc[i].reset_index()
... df.loc[i]
当然会返回原始数据框的子集,而.reset_index()
部分会将索引转换为列