如何通过python熊猫通过多索引获取价值?

xir*_*uru 6 python dataframe pandas

如何从数据框的多索引中获取值?

例如我有一个数据框mm

np.random.seed(1)
mm = pd.DataFrame(np.random.randn(5,2))
mm['A'] = np.arange(5)
mm['B'] = np.arange(5,10)
mm.set_index(['A','B'], inplace=True)

print mm

        0         1
A B                    
0 5  1.624345 -0.611756
1 6 -0.528172 -1.072969
2 7  0.865408 -2.301539
3 8  1.744812 -0.761207
4 9  0.319039 -0.249370
Run Code Online (Sandbox Code Playgroud)

我想得到A = 2,B = 7的值,我该怎么做?

是否可以编写类似的函数get_value(mm, (2,7)),然后得到以下结果:

2 7  0.865408 -2.301539
Run Code Online (Sandbox Code Playgroud)

unu*_*tbu 7

用于mm.loc按标签选择行:

In [28]: row = mm.loc[2,7]; row
Out[28]: 
0    0.865408
1   -2.301539
Name: (2, 7), dtype: float64

In [40]: np.concatenate([row.name, row])
Out[40]: array([ 2.        ,  7.        ,  0.86540763, -2.3015387 ])
Run Code Online (Sandbox Code Playgroud)

由于mm具有MultiIndex,因此每个行标签都表示为元组(例如(2,7))。如果没有歧义,例如放在方括号内,则可以删除括号:mm.loc[2, 7]等效于mm.loc[(2, 7)]


要获取所有行B=7,您可以

上面的每个表达式都返回DataFrame

            0         1
A B                    
2 7  0.865408 -2.301539
Run Code Online (Sandbox Code Playgroud)

  • 谢谢@unutbu,但是我是否可以只给出第二个索引?例如,我想选择所有行,其中B=7? (2认同)

Ale*_*der 6

这将您的选择作为数据框返回:

>>> mm.loc[[(2, 7)]]
            0         1
A B                    
2 7  0.865408 -2.301539
Run Code Online (Sandbox Code Playgroud)

获取索引和值:

>>> mm.loc[[(2, 7)]].reset_index().values.tolist()[0]
[2.0, 7.0, 0.8654076293246785, -2.3015386968802827]
Run Code Online (Sandbox Code Playgroud)

要获取第二项为 7 的所有值:

idx = pd.IndexSlice
>>> mm.loc[idx[:, 7], :]
            0         1
A B                    
2 7  0.865408 -2.301539
Run Code Online (Sandbox Code Playgroud)