này là rất dễ dàng bằng cách sử dụng máy thái đa chỉ số mới trong chủ/0.14 (phát hành sớm), xem here
Có một vấn đề mở để làm điều này syntatically dễ dàng hơn (nó không khó để làm), xem here ví dụ như một cái gì đó như thế này: df.loc[{ 'third' : ['C1','C3'] }]
tôi nghĩ là hợp lý
đây là cách bạn có thể làm điều đó (yêu cầu chủ/0,14):
In [2]: def mklbl(prefix,n):
...: return ["%s%s" % (prefix,i) for i in range(n)]
...:
In [11]: index = MultiIndex.from_product([mklbl('A',4),
mklbl('B',2),
mklbl('C',4),
mklbl('D',2)],names=['first','second','third','fourth'])
In [12]: columns = ['value']
In [13]: df = DataFrame(np.arange(len(index)*len(columns)).reshape((len(index),len(columns))),index=index,columns=columns).sortlevel()
In [14]: df
Out[14]:
value
first second third fourth
A0 B0 C0 D0 0
D1 1
C1 D0 2
D1 3
C2 D0 4
D1 5
C3 D0 6
D1 7
B1 C0 D0 8
D1 9
C1 D0 10
D1 11
C2 D0 12
D1 13
C3 D0 14
D1 15
A1 B0 C0 D0 16
D1 17
C1 D0 18
D1 19
C2 D0 20
D1 21
C3 D0 22
D1 23
B1 C0 D0 24
D1 25
C1 D0 26
D1 27
C2 D0 28
D1 29
C3 D0 30
D1 31
A2 B0 C0 D0 32
D1 33
C1 D0 34
D1 35
C2 D0 36
D1 37
C3 D0 38
D1 39
B1 C0 D0 40
D1 41
C1 D0 42
D1 43
C2 D0 44
D1 45
C3 D0 46
D1 47
A3 B0 C0 D0 48
D1 49
C1 D0 50
D1 51
C2 D0 52
D1 53
C3 D0 54
D1 55
B1 C0 D0 56
D1 57
C1 D0 58
D1 59
...
[64 rows x 1 columns]
Tạo một indexer trên tất cả các le VELS, chọn tất cả các mục
In [15]: indexer = [slice(None)]*len(df.index.names)
Make mức chúng ta quan tâm chỉ có các mục chúng tôi quan tâm
In [16]: indexer[df.index.names.index('third')] = ['C1','C3']
Chọn nó (nó quan trọng rằng đây là một tuple!)
In [18]: df.loc[tuple(indexer),:]
Out[18]:
value
first second third fourth
A0 B0 C1 D0 2
D1 3
C3 D0 6
D1 7
B1 C1 D0 10
D1 11
C3 D0 14
D1 15
A1 B0 C1 D0 18
D1 19
C3 D0 22
D1 23
B1 C1 D0 26
D1 27
C3 D0 30
D1 31
A2 B0 C1 D0 34
D1 35
C3 D0 38
D1 39
B1 C1 D0 42
D1 43
C3 D0 46
D1 47
A3 B0 C1 D0 50
D1 51
C3 D0 54
D1 55
B1 C1 D0 58
D1 59
C3 D0 62
D1 63
[32 rows x 1 columns]
để rõ ràng, làm điều này bằng tay trên wou dataframe này ld trông giống như 'df.loc [pd.IndexSlice [:,:, ['C1', 'C3'],:],:]' hoặc 'df.loc (trục = 0) [:,:, ['C1 ',' C3 '],:] ' – joris
Có cách nào để chọn phạm vi ngày từ một MultiIndex không? Tôi có 'df.loc [:, pd.IndexSlice [:,:,:,:, 'value']]' trong đó ':' đầu tiên sẽ là ngày và tôi muốn cắt theo phạm vi ngày và không chỉ một ngày. – toasteez