【发布时间】:2017-01-08 06:48:55
【问题描述】:
我有一个带有多索引的数据框:
>>> df = pd.DataFrame(np.random.randint(0,5,(6, 2)), columns=['col1','col2'])
>>> df['ind1'] = list('AAABCC')
>>> df['ind2'] = range(6)
>>> df.set_index(['ind1','ind2'], inplace=True)
>>> df
col1 col2
ind1 ind2
A 0 2 0
1 2 2
2 1 2
B 3 2 2
C 4 4 0
5 1 4
当我在其中一个索引级别上使用.loc[] 选择数据并随后应用.query() 时,结果索引按预期“缩小”以仅匹配结果数据框中包含的那些值:
>>> df.loc['A'].query('col2 == 2')
col1 col2
ind2
1 2 2
2 1 2
>>> df.loc['A'].query('col2 == 2').index
Int64Index([1, 2], dtype='int64', name='ind2')
但是,当我尝试仅使用 .query() 接收相同的结果时,pandas 会保留与原始数据帧相同的索引(尽管事实上,在单个索引的情况下它的行为与上述不同 - 结果索引从[0,1,2] 变为[1,2],仅匹配col2 == 2 行):
>>> df.query('ind1 == "A" & col2 == 2')
col1 col2
ind1 ind2
A 1 2 2
2 1 2
>>> df.query('ind1 == "A" & col2 == 2').index
MultiIndex(levels=[['A', 'B', 'C'], [0, 1, 2, 3, 4, 5]],
labels=[[0, 0], [1, 2]],
names=['ind1', 'ind2'])
这是错误还是功能?如果有特色,你能解释一下这种行为吗?
编辑1: 我希望使用以下索引:
MultiIndex(levels=[['A'], [1, 2]],
labels=[[0, 0], [0, 1]],
names=['ind1', 'ind2'])
编辑2: 正如Dataframe Slice does not remove Index Values 中解释的那样,在切片 DF 时根本不应该删除索引值;这种行为应该给出以下结果:
>>> df.loc['A'].query('col2 == 2')
col1 col2
ind2
1 2 2
2 1 2
>>> df.loc['A'].query('col2 == 2').index
EXPECTATION: Int64Index([0, 1, 2], dtype='int64', name='ind2')
REALITY: Int64Index([1, 2], dtype='int64', name='ind2')
【问题讨论】:
标签: python pandas dataframe multi-index