如何通过多索引从数据框中获取值?
例如,我有一个数据框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
我想获得A = 2,B = 7的值,我该怎么做?
是否可以编写类似get_value(mm, (2,7))
的函数,然后我可以得到以下结果:
2 7 0.865408 -2.301539
答案 0 :(得分:4)
使用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 ])
由于mm
具有MultiIndex,因此每个行标签都表示为元组(例如(2,7)
)。如果没有歧义,例如括号内,则可以删除括号:mm.loc[2, 7]
等同于mm.loc[(2, 7)]
。
要获取B=7
所有行,您可以
使用
pd.IndexSlice
:
xs = pd.IndexSlice
mm.loc[xs[:, 7], :]
mm.query('B==7')
或mm.index.get_loc_level
与mm.loc
:
mask, idx = index.get_loc_level(7, level='B')
mm.loc[mask]
或mm.index.get_loc_level
与mm.iloc
:
mask, idx = index.get_loc_level(7, level='B')
mm.iloc[idx]
上面的每个表达式都返回DataFrame
0 1
A B
2 7 0.865408 -2.301539
答案 1 :(得分:4)
这会将您的选择作为数据框返回:
>>> mm.loc[[(2, 7)]]
0 1
A B
2 7 0.865408 -2.301539
获取索引和值:
>>> mm.loc[[(2, 7)]].reset_index().values.tolist()[0]
[2.0, 7.0, 0.8654076293246785, -2.3015386968802827]
获取第二项为7的所有值:
idx = pd.IndexSlice
>>> mm.loc[idx[:, 7], :]
0 1
A B
2 7 0.865408 -2.301539