試圖了解 Slice(None) 的用例。用于構建示例資料框的代碼位于此處:https : //pandas.pydata.org/pandas-docs/stable/user_guide/advanced.html,但為了方便起見,我重復一遍:
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.loc[ (slice('A0'), slice('B0'),slice('C1', 'C2')),:]
dfmi.loc[ (slice('A0'), slice('B0'),slice('C1', 'C2')), ['a']]
dfmi.loc[ (slice('A0'), slice('B0'),slice('C1', 'C2')), slice('a')]
第一行讓我從索引中提取 A0、Bo 和 C1、C2。第二行讓我提取 col 索引的所有元素,最后一行只是使用列索引的切片符號重復第二行。
我的問題是 - 我可以使用 slice 也只提取一個特定的列(比如“bar”)嗎?該檔案并沒有完全“完成”示例(它可能已經建議如何在列索引下提取特定列)使用 slice。
我試過:
dfmi.loc[ (slice('A0'), slice('B0'),slice('C1', 'C2')), slice('a', 'bar')]
但這給了我 a 和 b (列的兩個索引)。與下面的代碼效果相同。
dfmi.loc[ (slice('A0'), slice('B0'),slice('C1', 'C2')), slice('bar')]
最后,
# dfmi.loc[ (slice('A0'), slice('B0'),slice('C1', 'C2')), ['bar']]
給出錯誤 - 'bar' 不在索引中(如預期)。
我說 slice 不能用于提取 'a' 和 'bar' 是否正確?我需要切換到 IndexSlice 還是 xs?感謝幫助!
uj5u.com熱心網友回復:
這讓你得到你想要的?
dfmi.loc[ (slice('A0'), slice('B0'),slice('C1', 'C2'))]['a','bar']
A0 B0 C1 D0 9
D1 13
C2 D0 17
D1 21
Name: (a, bar), dtype: int32
或這個?在列切片周圍使用括號,類似于索引
dfmi.loc[ (slice('A0'), slice('B0'),slice('C1', 'C2')),(slice('a'), slice('bar'))]
lvl0 a
lvl1 bar
A0 B0 C1 D0 9
D1 13
C2 D0 17
D1 21
uj5u.com熱心網友回復:
我們可以使用IndexSlice高級索引,這是一種更受歡迎的方式:
dfmi.loc[pd.IndexSlice['A0', 'B0', 'C1':'C2'], ('a', 'bar')]
或者slice你可以這樣做:
dfmi.loc[('A0', 'B0', slice('C1', 'C2')), ('a', 'bar')]
A0 B0 C1 D0 9
D1 13
C2 D0 17
D1 21
Name: (a, bar), dtype: int32
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/392034.html
上一篇:在資料框列中的字串周圍添加雙引號
