我怀疑,这是小事,但我还没有发现,让我从基于分层键的值的熊猫数据框选择行的咒语。 因此,举例来说,假设我们有以下的数据帧:
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 == 'A'
- 组1 == '一个' &组2 == 'C'
- 组2 == 'C'
- 组1在[ 'A', 'B', 'C']
尝试使用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
像下面的语法将工作:
df.ix['a']
df.ix['a'].ix['c']
自group1
和group2
的指标。 请原谅我以前的尝试!
只得到第二指数,我认为你必须交换指数:
df.swaplevel(0,1).ix['c']
但我敢肯定韦斯会纠正我,如果我错了。
在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