在 Pandas MultiIndex 中测试 Slice(None) 的功能
Testing functionality of Slice(None) in Pandas MultiIndex
试图了解 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。第二行让我提取列索引的所有元素,最后一行只是第二行的重复,使用列索引的切片表示法。
我的问题是 - 我是否可以使用 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?感谢您的帮助!
这能满足您的需求吗?
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
还是这个?在类似于 index
的列切片周围使用括号
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
我们可以使用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
试图了解 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。第二行让我提取列索引的所有元素,最后一行只是第二行的重复,使用列索引的切片表示法。
我的问题是 - 我是否可以使用 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?感谢您的帮助!
这能满足您的需求吗?
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
还是这个?在类似于 index
的列切片周围使用括号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
我们可以使用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