如何使用iloc来获取子级的矩阵

时间:2017-05-03 08:23:00

标签: python pandas indexing

我有一个有两个级别的方阵:

index = [('A','a'),('A','b'),('B','a'),('B','b')]
index = pd.MultiIndex.from_tuples(index)
pd.DataFrame(index=index, columns=index)

        A                B
        a        b       a       b
A   a   NaN     NaN     NaN     NaN
    b   NaN     NaN     NaN     NaN
B   a   NaN     NaN     NaN     NaN
    b   NaN     NaN     NaN     NaN

iloc的预期结果:

       a        b
  a   NaN     NaN
  b   NaN     NaN

我想用iloc得到子方矩阵A(a,b)(a,b)。 我尝试了十几种方法并在stackoverflow上搜索,但我找不到用iloc获取矩阵的方法。使用loc它很简单,但我需要迭代,我不想导航到索引以获得性能问题的标签。

提前致谢。

2 个答案:

答案 0 :(得分:0)

IIUC您可以先使用droplevel删除MultiIndex的最高级别:

index = [('A','a'),('A','b'),('B','a'),('B','b')]
index = pd.MultiIndex.from_tuples(index)
np.random.seed(100)
df = pd.DataFrame(np.random.rand(4,4),index=index, columns=index)
print (df)
            A                   B          
            a         b         a         b
A a  0.543405  0.278369  0.424518  0.844776
  b  0.004719  0.121569  0.670749  0.825853
B a  0.136707  0.575093  0.891322  0.209202
  b  0.185328  0.108377  0.219697  0.978624

df.columns = df.columns.droplevel(0)
df.index = df.index.droplevel(0)
print (df)
          a         b         a         b
a  0.543405  0.278369  0.424518  0.844776
b  0.004719  0.121569  0.670749  0.825853
a  0.136707  0.575093  0.891322  0.209202
b  0.185328  0.108377  0.219697  0.978624

a = df.iloc[:2,:2]
print (a)
          a         b
a  0.543405  0.278369
b  0.004719  0.121569

因为如果使用iloc只在索引和列中获得MultiIndex

b = df.iloc[:2,:2]
print (b)
            A          
            a         b
A a  0.543405  0.278369
  b  0.004719  0.121569

答案 1 :(得分:0)

使用jezrael的例子,这就是你要追求的目标吗?

df = df.iloc[[0,1],[0,1]]
Out[825]: 
            A          
            a         b
A a  0.543405  0.278369
  b  0.004719  0.121569

如果你只想要第二级,

df.index = df.index.droplevel(0)
df.columns = df.columns.droplevel(0)
print(df)
Out[835]: 
          a         b
a  0.543405  0.278369
b  0.004719  0.121569