【问题标题】:pandas.DataFrame.query keeping original multiindexpandas.DataFrame.query 保留原始多索引
【发布时间】: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


【解决方案1】:

df.loc[A] 为您返回一个带有常规(“单个”)索引的 DF(或“视图”):

In [12]: df.loc['A']
Out[12]:
      col1  col2
ind2
0        1     1
1        0     3
2        1     2

所以.query() 将应用于具有常规索引的 DF...

【讨论】:

  • 但这仍然不能解释这种行为。 .query() 应用于具有常规索引的 DF 会“缩小”索引,这在多索引的情况下不会发生......
  • .loc[] 收缩(选择一级)索引,而不是query()
  • @kekert,你没有写出你的问题 - df.query('ind1 == "A" & col2 == 2') 有什么问题?
  • 通过“缩小”我并不是说从索引中删除一个级别,而是只选择那些与结果数据框中的行匹配的索引条目。见我上面的评论 - 结果索引从[0,1,2] 变为[1,2],仅匹配col2 == 2
  • @kekert,现在我完全糊涂了!您对以下结果有何期待:df.query('ind1 == "A" & col2 == 2')
猜你喜欢
  • 2019-07-05
  • 1970-01-01
  • 1970-01-01
  • 2021-01-17
  • 2017-07-12
  • 2020-04-23
  • 2017-10-03
  • 2023-02-13
  • 2018-08-19
相关资源
最近更新 更多