python - 如何使用 python pandas 通过多索引获取值?

标签 python pandas dataframe

如何通过数据帧的多索引获取值?

例如,我有一个数据框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

最佳答案

使用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 method :

    mm.query('B==7')
    
  • mm.index.get_loc_levelmm.loc:

    mask, idx = index.get_loc_level(7, level='B')
    mm.loc[mask]
    
  • mm.index.get_loc_levelmm.iloc:

    mask, idx = index.get_loc_level(7, level='B')
    mm.iloc[idx]
    

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

            0         1
A B                    
2 7  0.865408 -2.301539

关于python - 如何使用 python pandas 通过多索引获取值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36510146/

相关文章:

python - 如何通过 Mechanize 传递隐藏的重新验证?

python - 对于从 0 到数据帧长度(负 1)的所有 n,如何获得距离为 n 的每对行之间的最小比率?

python - 如何在pandas中过滤groupby的结果

scala - 如何使用 Spark/scala 显示列函数的结果,就像 show() 对数据框所做的那样

python - 使用 Python 比较 CSV 文件的列

python - "Zipping"按列值的两个数据帧

python - 两个日期之间的 SQLALCHEMY 查询

Python 打印每个字符之间有空格的字符串

python - 为什么我在 CNN 中得到尖峰图(损失 vs 历元)

python - 使用列表根据多列中的值有条件地填充新列