在Pandas中为层次索引的内部维度选择不同的值

时间:2014-11-25 15:26:56

标签: python pandas

我有一个带有分层索引的大表,我正在尝试选择它的一个子集。有问题的真实表有0级到0轴索引,我想要1级和2级的所有值以及级别3的一个选项。

对于我正在尝试做的小型2级示例,这里是数据框设置:

import pandas as pd
import numpy as np
df = pd.DataFrame({'I1': [1,1,1,1,2,2,2,2,3,3,3,3], 
                   'I2': ['foo', 'bar', 'blatz', 'blam',
                          'foo', 'bar', 'blatz', 'blam',
                          'foo', 'bar', 'blatz', 'blam'],
                   'V': np.arange(12)})
df = df.set_index(['I1', 'I2'])
print df

生成数据框:

           V
I1 I2       
1  foo     0
   bar     1
   blatz   2
   blam    3
2  foo     4
   bar     5
   blatz   6
   blam    7
3  foo     8
   bar     9
   blatz  10
   blam   11

然后我有一个选择器系列:

> sel = pd.DataFrame({'I1': [1,2,3], 'I2': ['foo', 'blatz', 'bar']}).set_index(['I1'])
> print sel
       I2
I1       
1     foo
2   blatz
3     bar

所以我要做的是使用sel来选择df的子集。如果我只想为每个I1设置相同的I2值,那么xs就可以了,但它似乎不适用于系列而不是单个值。

我尝试取消堆叠df并使用该系列选择列,但这似乎不正确(并使我的机器内存不足)。

我的下一次尝试是重置dfsel上的索引,然后使用连接。这真的是最好的方法吗,还是有一个我错过的更好的技巧?

1 个答案:

答案 0 :(得分:1)

您使用join的直觉很好。这就是熊猫式的做法:

sel = pd.DataFrame({'I1': [1,2,3], 'I2': ['foo', 'blatz', 'bar']}).set_index(['I1','I2'])
print df.join(sel, how = 'right')

          V
I1 I2      
1  foo    0
2  blatz  6
3  bar    9