【发布时间】:2022-01-24 14:32:40
【问题描述】:
试图了解 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' 不在索引中(如预期的那样)。
我说切片不能用于提取“a”和“bar”是否正确?我需要切换到 IndexSlice 还是 xs?感谢您的帮助!
【问题讨论】: