选择从数据帧熊猫行与化合物(分级的)指数(Selecting rows from a Pandas

2019-06-27 00:15发布

我怀疑,这是小事,但我还没有发现,让我从基于分层键的值的熊猫数据框选择行的咒语。 因此,举例来说,假设我们有以下的数据帧:

import pandas
df = pandas.DataFrame({'group1': ['a','a','a','b','b','b'],
                       'group2': ['c','c','d','d','d','e'],
                       'value1': [1.1,2,3,4,5,6],
                       'value2': [7.1,8,9,10,11,12]
})
df = df.set_index(['group1', 'group2'])

DF看起来像我们所期望的:

如果DF不上1组索引我可以做到以下几点:

df['group1' == 'a']

但是,这无法对这个数据帧与索引。 所以,也许我应该想到这一点像熊猫系列采用了分级指数:

df['a','c']

不。 这也将失败。

那么,如何选择出所有的行,其中:

  1. 组1 == 'A'
  2. 组1 == '一个' &组2 == 'C'
  3. 组2 == 'C'
  4. 组1在[ 'A', 'B', 'C']

Answer 1:

尝试使用xs非常精确:

In [5]: df.xs('a', level=0)
Out[5]: 
        value1  value2
group2                
c          1.1     7.1
c          2.0     8.0
d          3.0     9.0

In [6]: df.xs('c', level='group2')
Out[6]: 
        value1  value2
group1                
a          1.1     7.1
a          2.0     8.0


Answer 2:

像下面的语法将工作:

df.ix['a']
df.ix['a'].ix['c']

group1group2的指标。 请原谅我以前的尝试!

只得到第二指数,我认为你必须交换指数:

df.swaplevel(0,1).ix['c']

但我敢肯定韦斯会纠正我,如果我错了。



Answer 3:

在Python 0.19.0有一个新的建议的方法,这是这里解释1 。 我相信他们给出的最明显的例子是下面的,各自从一个四级索引切片。 这是数据框是怎么做:

In [46]: def mklbl(prefix,n):
   ....:     return ["%s%s" % (prefix,i)  for i in range(n)]
   ....: 

In [47]: miindex = pd.MultiIndex.from_product([mklbl('A',4),
   ....:                                       mklbl('B',2),
   ....:                                       mklbl('C',4),
   ....:                                       mklbl('D',2)])
   ....: 

In [48]: micolumns = pd.MultiIndex.from_tuples([('a','foo'),('a','bar'),
   ....:                                        ('b','foo'),('b','bah')],
   ....:                                       names=['lvl0', 'lvl1'])
   ....: 

In [49]: dfmi = pd.DataFrame(np.arange(len(miindex)*len(micolumns)).reshape((len(miindex),len(micolumns))),
   ....:                     index=miindex,
   ....:                     columns=micolumns).sort_index().sort_index(axis=1)
   ....: 

In [50]: dfmi
Out[50]: 
lvl0           a         b     
lvl1         bar  foo  bah  foo
A0 B0 C0 D0    1    0    3    2
         D1    5    4    7    6
      C1 D0    9    8   11   10
         D1   13   12   15   14
      C2 D0   17   16   19   18
         D1   21   20   23   22
      C3 D0   25   24   27   26
...          ...  ...  ...  ...
A3 B1 C0 D1  229  228  231  230
      C1 D0  233  232  235  234
         D1  237  236  239  238
      C2 D0  241  240  243  242
         D1  245  244  247  246
      C3 D0  249  248  251  250
         D1  253  252  255  254

而这也是他们选择不同的行:

In [51]: dfmi.loc[(slice('A1','A3'),slice(None), ['C1','C3']),:]
Out[51]: 
lvl0           a         b     
lvl1         bar  foo  bah  foo
A1 B0 C1 D0   73   72   75   74
         D1   77   76   79   78
      C3 D0   89   88   91   90
         D1   93   92   95   94
   B1 C1 D0  105  104  107  106
         D1  109  108  111  110
      C3 D0  121  120  123  122
...          ...  ...  ...  ...
A3 B0 C1 D1  205  204  207  206
      C3 D0  217  216  219  218
         D1  221  220  223  222
   B1 C1 D0  233  232  235  234
         D1  237  236  239  238
      C3 D0  249  248  251  250
         D1  253  252  255  254

所以很简单,在df.loc[(indices),:]你指定要每升一级选择,从最高级别到最低的指数。 如果你不想进行选择指数的最低水平(S),你可以省略指定它们。 如果你不想让其他指定级别之间的切片,添加slice(None) 。 这两种情况下被示出的例子中,其中电平d被省略并且被A和C之间指定电平B



文章来源: Selecting rows from a Pandas dataframe with a compound (hierarchical) index