使用切片(slicers)
你可以使用切片来选择MultiIndex, slice是python内置的函数(其实是一个类), 他的用法是这样的:
1
2
3alist = list('abcdefg' * 3)
selector = slice(1, 6, 2)
alist[selector]
输出(plain):
['b', 'd', 'f']
我们可以使用slice来选择MultiIndex。
下面先创建一个DataFrame:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22import pandas as pd
import numpy as np
def mklbl(prefix,n):
return ["%s%s" % (prefix,i) for i in range(n)]
miindex = pd.MultiIndex.from_product([mklbl('A',4),
mklbl('B',2),
mklbl('C',4),
mklbl('D',2)])
micolumns = pd.MultiIndex.from_tuples([('a','foo'),('a','bar'),
('b','foo'),('b','bah')],
names=['lvl0', 'lvl1'])
dfmi = pd.DataFrame(np.arange(len(miindex)*len(micolumns)).reshape((len(miindex),len(micolumns))),
index=miindex,
columns=micolumns).sort_index().sort_index(axis=1)
dfmi.head()
输出(html):
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
下面我们需要选择出MultiIndex第一层为A1或A2或A3, 第二层不做选择, 第三层只包括C1和C3的行:
1dfmi.loc[(slice('A1', 'A3'), slice(None), ['C1', 'C3']), :]
输出(html):
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
D1
125
124
127
126
A2
B0
C1
D0
137
136
139
138
D1
141
140
143
142
C3
D0
153
152
155
154
D1
157
156
159
158
B1
C1
D0
169
168
171
170
D1
173
172
175
174
C3
D0
185
184
187
186
D1
189
188
191
190
A3
B0
C1
D0
201
200
203
202
D1
205
204
207
206
C3
D0
217
216
219
218
D1
221
220
223
222
B