使用pandas multiIndexed数据框进行选择

时间:2017-03-18 14:04:54

标签: python-3.x pandas dataframe indexing multi-index

我有一个看起来像这样的multiIndexed数据框:

df.head():

enter image description here

如何选择第一个索引==“特定学校名称”的所有行以及所有第二个索引,其中Month列==“Jan”?

之前我还没有使用过multiIndexed数据帧,我可以像这样选择Month ==“Jan”的所有行:

df[df['Month'] == 'Jan']

但这给了我所有的学校。我一直在玩它,但还没能为一所学校添加索引。那么这是如何工作的?

编辑:好的,这样可行:df[df['Month'] == 'Mar'].loc["School Name"],但这是否有更惯用的方式,或者这是标准方式?

1 个答案:

答案 0 :(得分:4)

您可以使用query

print (df.query('ilevel_0 == "School Name" and Month == "Jan"'))

样品:

df = pd.DataFrame({'A':['School Name','Agona','another'],
                   'B':[0,1,2],
                   'Month':['Jan', 'Jan', 'Feb']}).set_index(['A','B'])
df.index.names = [None, None]
print (df)
              Month
School Name 0   Jan
Agona       1   Jan
another     2   Feb

print (df.query('ilevel_0 == "School Name" and Month == "Jan"'))
              Month
School Name 0   Jan

print (df.query('ilevel_0 == "School Name" & Month == "Jan"'))
              Month
School Name 0   Jan

boolean indexing的解决方案:

mask = (df.index.get_level_values(0) == 'School Name') & (df['Month'] == 'Jan')
print (df[mask])
              Month
School Name 0   Jan

编辑:

使用变量@

var = 'School Name'
print (df.query('ilevel_0 == @var & Month == "Jan"'))
              Month
School Name 0   Jan