我有一個多指標數據幀是這樣的:如何將多索引數據幀的子集存儲在新的數據框中?
import pandas as pd
import numpy as np
df = pd.DataFrame({'ind1': list('aaaaaaaaabbbbbbbbb'),
'ind2': list('cccdddeeecccdddeee'),
'ind3': list(range(3))*6,
'val1': list(range(100, 118)),
'val2': list(range(70, 88))})
df_mult = df.set_index(['ind1', 'ind2', 'ind3'])
val1 val2
ind1 ind2 ind3
a c 0 100 70
1 101 71
2 102 72
d 0 103 73
1 104 74
2 105 75
e 0 106 76
1 107 77
2 108 78
b c 0 109 79
1 110 80
2 111 81
d 0 112 82
1 113 83
2 114 84
e 0 115 85
1 116 86
2 117 87
我現在可以使用.loc
這樣
df_subs = df_mult.loc['a', ['c', 'd'], :]
現在給人的預期
val1 val2
ind1 ind2 ind3
a c 0 100 70
1 101 71
2 102 72
d 0 103 73
1 104 74
2 105 75
如果我選擇它的一個子集想要再次選擇df_subs
的子集,例如
df_subs.loc['a', 'c', :]
作品並給出
val1 val2
ind3
0 100 70
1 101 71
2 102 72
然而
df_subs.loc[:, 'c', :]
失敗,並給出了一個錯誤
KeyError: 'the label [c] is not in the [columns]'
爲什麼會失敗?
編輯
本來,我在這個職位上工作兩個問題。我把它分成兩部分,第二個問題可以找到here。
https://pandas.pydata.org/pandas-docs/stable/advanced.html爲什麼不使用'slice'或'IndexSlice' – Wen
@Wen:當然,可能會有更好的選擇,但我仍然想了解上述嘗試失敗的原因。如果這些嘗試完全錯誤,那麼很高興看到正確的做法,即可行的替代方案。 – Cleb
@JohnE:好的,這已經很好了。我仍然需要弄清楚什麼時候我不得不使用'IndexSlice'。但似乎它沒有改變問題1的任何內容:'df_mult.loc [pd.IndexSlice ['a',['c','d'],:],:]。index'仍然顯示出'a'和' b'在0級;任何想法爲什麼? – Cleb