我有一个带有分层索引的大表,我正在尝试选择它的一个子集。有问题的真实表有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
并使用该系列选择列,但这似乎不正确(并使我的机器内存不足)。
我的下一次尝试是重置df
和sel
上的索引,然后使用连接。这真的是最好的方法吗,还是有一个我错过的更好的技巧?
答案 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